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)
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
编辑:重新排列解决方案的顺序
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编程插图中介绍了更多一般情况。
- 3 回答
- 0 关注
- 491 浏览
添加回答
举报