【问题标题】:Is there a way to combine dplyr::filter_at results? (filtering many variables at once)有没有办法组合 dplyr::filter_at 结果? (一次过滤多个变量)
【发布时间】:2026-01-18 14:25:01
【问题描述】:

我有以下数据框:

  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)的行(在我的实际数据中,A 之间还有更多变量和C)。我可以通过这样做过滤所有 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 &amp; B == 1 ... )),因为我还有很多其他列。

欢迎任何替代方法或软件包建议。

【问题讨论】:

  • 您是要过滤掉匹配的行,还是只保留匹配的行?你既定的目标和理想的输出是相反的。

标签: r filter dplyr data-science


【解决方案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 

【讨论】:

    【解决方案2】:

    i 位置和 [ 中使用逻辑索引的旧式 R 编程:

    df[ apply( df[1:3], 1, function(x){sum(x==5)==3 || sum(x==1)==3}), ]
      A B C D
    3 1 1 1 2
    4 5 5 5 2
    5 5 5 5 2
    
    df[apply( df[1:3], 1, function(x){all(x==5) || all(x==1)}), ]
      A B C D
    3 1 1 1 2
    4 5 5 5 2
    5 5 5 5 2
    

    【讨论】:

      最近更新 更多