在dplyr::filter中将字符串作为变量名传递
我用mtcars数据集来说明我的问题 例如,我想将数据子集为4缸汽车。我可以执行以下操作:在dplyr::filter中将字符串作为变量名传递,r,dplyr,R,Dplyr,我用mtcars数据集来说明我的问题 例如,我想将数据子集为4缸汽车。我可以执行以下操作: mtcars %>% filter(cyl == 4) 在我的工作中,我需要传递一个字符串变量作为我的列名。例如: var <- 'cyl' mtcars %>% filter(var == 4) 在这两种情况下,我都得到了空数据帧 或UQ计算变量,因此mtcars%>%filter(!!var==4)与mtcars%>%filter('cyl'==4)相同,其中条件总是计算为fal
mtcars %>% filter(cyl == 4)
在我的工作中,我需要传递一个字符串变量作为我的列名。例如:
var <- 'cyl'
mtcars %>% filter(var == 4)
在这两种情况下,我都得到了空数据帧
或UQ
计算变量,因此mtcars%>%filter(!!var==4)
与mtcars%>%filter('cyl'==4)
相同,其中条件总是计算为false;您可以通过打印!!过滤函数中的var
:
mtcars %>% filter({ print(!!var); (!!var) == 4 })
# [1] "cyl"
# [1] mpg cyl disp hp drat wt qsec vs am gear carb
# <0 rows> (or 0-length row.names)
或者使用baseR中的as.symbol/as.name
:
mtcars %>% filter((!!as.symbol(var)) == 4)
mtcars %>% filter((!!as.name(var)) == 4)
或UQ
计算变量,因此mtcars%>%filter(!!var==4)
与mtcars%>%filter('cyl'==4)
相同,其中条件总是计算为false;您可以通过打印!!过滤函数中的var
:
mtcars %>% filter({ print(!!var); (!!var) == 4 })
# [1] "cyl"
# [1] mpg cyl disp hp drat wt qsec vs am gear carb
# <0 rows> (or 0-length row.names)
或者使用baseR中的as.symbol/as.name
:
mtcars %>% filter((!!as.symbol(var)) == 4)
mtcars %>% filter((!!as.name(var)) == 4)
您可以使用eval(parse(text=将字符串作为变量进行求值:
mtcars %>% filter(eval(parse(text='cyl')) == 4)
您可以使用eval(parse)(text=将字符串作为变量进行求值:
mtcars %>% filter(eval(parse(text='cyl')) == 4)
我认为@snoram的回答很优雅,完全依赖于
dplyr
var <- c('cyl')
mtcars %>% filter(get(var) == 4)
var%过滤器(获取(var)==4)
您还可以将其用于列表。举个简单的例子,您可以将每个筛选列的计数作为新的数据集
#adding car name
mtcars <- rownames_to_column(mtcars, "car_name")
#name your vectors
vector <- c("vs","am","carb")
df2 <- data.frame()
for (variable in vector) {
df1 <- mtcars %>% filter(get(variable) == 1) %>% summarise(variable = n_distinct(car_name)) %>% data.frame()
df2<- rbind(df2,df1)
}
#添加汽车名称
mtcars我认为@snoram的答案很优雅,完全依赖于dplyr
var <- c('cyl')
mtcars %>% filter(get(var) == 4)
var%过滤器(获取(var)==4)
您还可以将其用于列表。举个简单的例子,您可以将每个筛选列的计数作为新的数据集
#adding car name
mtcars <- rownames_to_column(mtcars, "car_name")
#name your vectors
vector <- c("vs","am","carb")
df2 <- data.frame()
for (variable in vector) {
df1 <- mtcars %>% filter(get(variable) == 1) %>% summarise(variable = n_distinct(car_name)) %>% data.frame()
df2<- rbind(df2,df1)
}
#添加汽车名称
mtcars现在建议使用.data
代词:
library(dplyr)
mtcars %>% filter(.data[[var]] == 4)
# mpg cyl disp hp drat wt qsec vs am gear carb
#Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
#Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
#Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
#Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
#Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
#Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
#Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
#Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
#Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
现在建议使用.data
代词:
library(dplyr)
mtcars %>% filter(.data[[var]] == 4)
# mpg cyl disp hp drat wt qsec vs am gear carb
#Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
#Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
#Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
#Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
#Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
#Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
#Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
#Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
#Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
我怎么能做同样的事情,但对于字符串列表(最终对应于列名列表)@Psidom,使用您给出的示例,这些方法在我的安装(使用R3.5)中都不起作用。“sym”方法返回与mtcars大小相同的矩阵,但都是零。“as.symbol”和“as.name”方法都返回“无效参数类型”错误。知道发生了什么吗?如果您需要另一个包在dplyr中执行此操作,这太疯狂了,mtcars%>%filter(get(var)==4)
?不确定使用get()
是否有任何问题,但dplyr已经导入了rlang,因此它已经安装好了。get()是simplerhow我可以做同样的事情,但是对于字符串列表(最终对应于列名列表)@Psidom,使用您给出的示例,这些方法在我的安装(使用R3.5)中都不起作用。“sym”方法返回与mtcars大小相同的矩阵,但都是零。“as.symbol”和“as.name”“方法都返回“无效参数类型”错误。知道发生了什么吗?如果您需要另一个包在dplyr中执行此操作,这太疯狂了,mtcars%>%filter(get(var)==4)
?不确定使用get()
是否有任何问题,但dplyr已经导入了rlang,因此它已经安装好了。get()simplerI looove这个解决方案!我不明白为什么将变量名指定为变量会如此困难(函数中包含dyplr)。这是一个令人惊讶且易于理解的解决方案。我looove这个解决方案!我不明白为什么将变量名指定为变量会如此困难(函数中包含dyplr)。这是一个令人惊讶且简单易懂的解决方案。这能回答您的问题吗?这能回答您的问题吗?如果您想使用mutate
作为dplyr动词,这看起来不起作用。这取决于您正在尝试做什么。如果您想使用mutate
作为dplyr动词,这看起来不起作用。这取决于什么你正在努力去做。