[英]Pass a string as variable name in dplyr::filter
我正在使用 mtcars 數據集來說明我的問題。
例如,我想將數據子集到 4 缸汽車。我可以這樣做:
mtcars %>% filter(cyl == 4)
在我的工作中,我需要傳遞一個字符串變量作為我的列名。 例如:
var <- 'cyl'
mtcars %>% filter(var == 4)
我也做了:
mtcars %>% filter(!!var == 4)
在這兩種情況下,我都得到了空的數據框。
!!
或UQ
計算變量,因此mtcars %>% filter(!!var == 4)
與mtcars %>% filter('cyl' == 4)
,其中條件總是評估為假; 您可以通過在過濾器函數中打印!!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
# ...
或者使用as.symbol/as.name
as.name:
mtcars %>% filter((!!as.symbol(var)) == 4)
mtcars %>% filter((!!as.name(var)) == 4)
我認為@snoram 的回答很優雅,並且完全依賴於dplyr
。
var <- c('cyl')
mtcars %>% filter(get(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)
}
現在推薦使用.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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.