有没有一种方法可以合并dplyr :: filter_at结果? (一次过滤许多变量)

时间:2020-02-08 21:56:25

标签: r filter dplyr data-science

我有以下数据框:

  A B C D
1 1 2 3 T
2 1 5 5 F
3 1 1 1 T
4 5 5 5 T
5 5 5 5 T

我正在尝试删除变量AC的行,这些行包含相同的数字(例如,全5,全1)(在我的实际数据中,我还有更多的变量在AC之间)。通过执行以下操作,我可以过滤所有5的行:

library(dplyr)

A <- c(1, 1, 1, 5, 5)
B <- c(2, 5, 1, 5, 5)
C <- c(3, 5, 1, 5, 5)
D <- c(2, 2, 2, 2, 2)

df <- data.frame(A, B, C, D)

df %>%
  filter_at(.vars = 1:3, .vars_predicate = all_vars(. == 5))


  A B C D
1 5 5 5 T
2 5 5 5 T

是否可以链接另一个filter_at(),以便对全为1的行执行相同的操作?理想的输出是这样:

  A B C D
1 5 5 5 T
2 5 5 5 T
3 1 1 1 T

我已经尝试在all_vars()中使用逻辑运算符,但是无法产生正确的结果。在下面的结果数据框中,我们得到的行同时包含5和1。

df %>%
  filter_at(.vars = 1:3, .vars_predicate = all_vars(. == 5 | . == 1))

  A B C D
1 1 5 5 F
2 1 1 1 T
3 5 5 5 T
4 5 5 5 T

同样,我尝试避免手动过滤每个变量(例如filter(A == 1 & B == 1 ... )),因为我还有很多其他列。

任何其他替代方法或包装建议都非常受欢迎。

2 个答案:

答案 0 :(得分:1)

i的{​​{1}}位置使用逻辑索引的老式R编程:

[

答案 1 :(得分:1)

您需要一个可以按行评估值的函数。有几种选择,但是一种选择是:

library(dplyr)

df %>%
  filter_at(1:3, ~ .x %in% c(1,5) & do.call(pmin, df[1:3]) == do.call(pmax, df[1:3])) 

  A B C D
1 1 1 1 2
2 5 5 5 2
3 5 5 5 2