我已经与消费者建立了一个数据库,每个列都是他们遇到的条件。我想选择一个只满足每个条件的基础,所以我做了循环,但过滤器功能似乎不起作用,并且在每个基础中我得到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, ]
答案 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.2
和get
R 3.1.3
方法
dplyr_0.4.3