带有动态变量名称的 dplyr 过滤器

问题描述 投票:0回答:3

我试图仅选择没有 NA 的行:

library(dplyr)
x = data.frame(a = c(NA, 2, 3, 4))
var_a <- "a"
# This works:
x %>% filter(!is.na(a))
# That works too:
var_a <- quo(a)
x %>% filter(!is.na(!!var_a))
# But this doesn't work:
var_a <- "a"
x %>% filter(!is.na(!!var_a))

我应该在最后一行更改什么才能使其正常工作?因为我必须和 var_a 一起工作 <- "a". Thank you very much!

r filter dplyr
3个回答
20
投票

它是一个字符串,所以我们可以用

sym
转换为符号,然后使用
!!

x %>% 
   filter(!is.na(!!rlang::sym(var_a)))
#  a
#1 2
#2 3
#3 4

或者另一种选择是在

filter_at
中指定对象,然后进行过滤

x %>% 
   filter_at(var_a, all_vars(!is.na(.)))
#  a
#1 2
#2 3
#3 4

3
投票

不要按列名称引用,只需为其提供要过滤的整个列。

x = data.frame(a = c(NA, 2, 3, 4))
var_a <- "a"
x %>% filter(!is.na(!!x[,var_a])) 

注意到我刚刚将

var_a
更改为
x[,var_a]


0
投票

这可能与 tidyselect 一致并且在组内工作:

filter(!is.na(c_across(all_of(var_a))))
© www.soinside.com 2019 - 2024. All rights reserved.