在`dplyr`过滤器中使用变量

时间:2017-09-01 07:13:51

标签: r dplyr

我已经与消费者建立了一个数据库,每个列都是他们遇到的条件。我想选择一个只满足每个条件的基础,所以我做了循环,但过滤器功能似乎不起作用,并且在每个基础中我得到0结果,事件我知道我应该得到一些东西:

database <- data.frame(ID = 1:10, Con1 = c(1,1,0,1,0,0,0,1,0,1), Con2 = c(1,0,0,0,0,0,0,0,0,0))
varibles <- names(database)[2:3]

for(i in 1:length(varibles) ){
  tmp <- database %>%  
    filter_(varibles[i] == 1) 
}

我读到我应该使用带有“_”的过滤器,但它不起作用(Use variable names in functions of `dplyr`

我解决了不使用dplyr的问题:

  tmp <- database  
  tmp <- tmp[tmp[, varibles[i]] == 1, ]  

1 个答案:

答案 0 :(得分:1)

也许,我们不需要循环,使用filter_at

如果我们需要filter具有任何'Con'值的行为1,那么我们使用any_vars来引用谓词表达式应该应用于{{{ 1}}(这里我们使用索引。如果我们需要字符串名称,则用.predicate

包装它
vars(matches("Con"))

假设,如果我们需要为两列添加1,请使用database %>% filter_at(2:3, any_vars(.==1))

all_vars

对于多个数据集,启动database %>% filter_at(2:3, all_vars(.==1)) 并将每次迭代的输出存储在其中

list

tmp <- setNames(vector("list", length(varibles)), varibles) for(i in seq_along(varibles)){ tmp[[i]] <- database %>% filter_at(vars(varibles[i]), all_vars(. == 1)) }

中的sym
rlang

上述方法正在使用tmp <- setNames(vector("list", length(varibles)), varibles) for(i in seq_along(varibles)){ tmp[[i]] <- database %>% filter(UQ(rlang::sym(varibles[i])) == 1) } tmp #$Con1 # ID Con1 Con2 #1 1 1 1 #2 2 1 0 #3 4 1 0 #4 8 1 0 #5 10 1 0 #$Con2 # ID Con1 Con2 #1 1 1 1 R 3.4.1。由于OP在将R更新为新版本时提到了一些困难,我们使用dplyr_0.7.2get

尝试了R 3.1.3方法
dplyr_0.4.3