我正在使用mtcars数据集来说明我的问题。
例如,我想将数据子集到4缸汽车。我可以这样做:
mtcars %>% filter(cyl == 4)
在我的工作中,我需要传递一个字符串变量作为我的列名。例如:
var <- 'cyl'
mtcars %>% filter(var == 4)
我也做了:
mtcars %>% filter(!!var == 4)
在这两种情况下,我得到了空数据帧。
答案 0 :(得分:16)
!!
或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)
要评估var
到cyl
列,您需要先将var
转换为cyl
的符号,然后将符号cyl
评估为柱:
使用rlang
:
library(rlang)
var <- 'cyl'
mtcars %>% filter((!!sym(var)) == 4)
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#2 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
#3 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
# ...
或者使用baseR中的as.symbol/as.name
:
mtcars %>% filter((!!as.symbol(var)) == 4)
mtcars %>% filter((!!as.name(var)) == 4)
答案 1 :(得分:8)
现在建议使用.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
答案 2 :(得分:6)
我认为@snoram的回答很优雅,完全取决于mid rt stamp mt
----------------------------------
111 3 2018-12-08 01:30:31 rel
111 4 2018-12-08 03:41:56 qt
111 3 2018-12-08 02:29:10 qt
110 1 2018-12-08 06:13:51 rel
110 5 2018-12-08 11:44:39 qt
109 1 2018-12-08 10:39:51 rel
。
dplyr
您也可以将其与列表一起使用。举一个简单的例子,您可以将每个过滤出的列的计数作为一个新的数据集。
var <- c('cyl')
mtcars %>% filter(get(var) == 4)
答案 3 :(得分:0)