为了账号安全,请及时绑定邮箱和手机立即绑定

在dplyr函数中使用变量名

在dplyr函数中使用变量名

慕勒3428872 2019-12-13 15:10:40
我想在中使用变量名作为字符串dplyr。请参阅以下示例:df <- data.frame(       color = c("blue", "black", "blue", "blue", "black"),       value = 1:5)filter(df, color == "blue")它运行完美,但是我想color通过字符串来引用,就像这样:var <- "color"filter(df, this_probably_should_be_a_function(var) == "blue").我很乐意以任何方式做到这一点,并且非常乐于使用易于阅读的dplyr语法。
查看完整描述

3 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

对于dplyr版本[0.3-0.7)(?-2017年6月)

(有关最新dplyr版本,请参阅此问题的其他答案)


从使用非标准评估(NSE,请参见发布和小插图)的dplyr 0.3每个dplyr功能开始, 标准评估(SE)双胞胎以下划线结尾。这些可用于传递变量。因为会的。使用您可能会将逻辑条件作为字符串传递。filterfilter_filter_


filter_(df, "color=='blue'")


#   color value

# 1  blue     1

# 2  blue     3

# 3  blue     4

用逻辑条件构造字符串当然很简单


l <- paste(var, "==",  "'blue'")

filter_(df, l)



查看完整回答
反对 回复 2019-12-14
?
LEATH

TA贡献1936条经验 获得超6个赞

在较新的版本中,我们可以使用我们可以创建带引号的变量,然后取消引号(UQ或!!)以进行评估


var <- quo(color)

filter(df, UQ(var) == "blue")

#   color value

#1  blue     1

#2  blue     3

#3  blue     4

由于运算符的优先级,我们可能需要()环绕!!


filter(df, (!!var) == "blue")

#   color value

#1  blue     1

#2  blue     3

#3  blue     4

对于新版本,||优先级更高,因此


filter(df, !! var == "blue")

应该工作(如@Moody_Mudskipper评论)


较旧的选项

我们还可以使用:


 filter(df, get(var, envir=as.environment(df))=="blue")

 #color value

 #1  blue     1

 #2  blue     3

 #3  blue     4

编辑:重新排列解决方案的顺序



查看完整回答
反对 回复 2019-12-14
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

从dplyr 0.7开始,某些情况再次发生了变化。


library(dplyr)

df <- data.frame( 

  color = c("blue", "black", "blue", "blue", "black"), 

  value = 1:5)

filter(df, color == "blue")


# it was already possible to use a variable for the value

val <- 'blue'

filter(df, color == val)


# As of dplyr 0.7, new functions were introduced to simplify the situation

col_name <- quo(color) # captures the current environment

df %>% filter((!!col_name) == val)


# Remember to use enquo within a function

filter_col <- function(df, col_name, val){

  col_name <- enquo(col_name) # captures the environment in which the function was called

  df %>% filter((!!col_name) == val)

}

filter_col(df, color, 'blue')

dplyr编程插图中介绍了更多一般情况。



查看完整回答
反对 回复 2019-12-14
  • 3 回答
  • 0 关注
  • 491 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信