【问题标题】:How to use dplyr to filter rows where value in a specific column is 1 and all the rest are 0?如何使用 dplyr 过滤特定列中的值为 1 而其余所有值为 0 的行?
【发布时间】:2021-12-29 15:08:49
【问题描述】:

使用dplyr 函数,我想删除其中只有列b 等于1 并且列的其余 都是0 的行。

虽然我可以这样做:

library(dplyr, warn.conflicts = FALSE)

trb <-
  tribble(~a, ~b, ~c,
          1, 1, 1,
          1, 1, 0,
          1, 0, 1,
          0, 1, 0, # <~~~ remove this
          0, 0, 0,
          0, 1, 0  # <~~~ remove this
          )

trb %>%
  filter(!(b == 1 & a == 0 & c == 0))
#> # A tibble: 4 x 3
#>       a     b     c
#>   <dbl> <dbl> <dbl>
#> 1     1     1     1
#> 2     1     1     0
#> 3     1     0     1
#> 4     0     0     0

我正在寻找一种更具可扩展性的解决方案来处理以下数据:

trb_2 <-
  tibble::tribble(
    ~a, ~b, ~c, ~d, ~e, ~f, ~g, ~h, ~i, ~j, ~k, ~l, ~m, ~n, ~o, ~p, ~q, ~r, ~s, ~t, ~u, ~v, ~w, ~x, ~y, ~z,
    0,  0,  1,  0,  1,  1,  1,  0,  0,  0,  0,  1,  1,  0,  1,  0,  0,  1,  1,  0,  0,  1,  0,  0,  0,  0,
    1,  0,  1,  1,  1,  0,  1,  1,  1,  0,  0,  1,  1,  1,  1,  1,  0,  1,  1,  0,  1,  0,  0,  1,  1,  1,
    0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    1,  1,  0,  0,  0,  0,  1,  1,  1,  0,  0,  1,  1,  1,  0,  1,  1,  0,  1,  1,  1,  1,  0,  1,  1,  1,
    0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    1,  1,  0,  0,  0,  1,  0,  1,  1,  1,  1,  0,  0,  0,  1,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  1,
    1,  0,  0,  0,  1,  0,  1,  1,  0,  0,  0,  1,  0,  1,  0,  0,  1,  0,  0,  1,  1,  0,  0,  0,  0,  0,
    0,  1,  1,  0,  0,  0,  0,  1,  1,  1,  1,  0,  1,  1,  1,  0,  1,  0,  1,  0,  1,  0,  0,  0,  0,  0,
    0,  0,  1,  0,  1,  0,  1,  1,  1,  0,  1,  1,  1,  0,  0,  1,  0,  0,  0,  1,  1,  1,  0,  1,  1,  0,
    0,  0,  0,  1,  0,  0,  0,  1,  0,  1,  1,  0,  1,  0,  0,  0,  0,  1,  0,  0,  1,  1,  0,  0,  1,  1
  )

trb_2 中,我仍然想删除b 等于1 的行并且其余的都是0


有没有使用dplyr::filter() 的可扩展方式来实现这一点?

【问题讨论】:

  • 从您上次的编辑看来,您希望只保留行,其中 b 为 1,其他为 0。我以为您要求删除只有这些行?哪个是正确的?
  • 对不起,你是对的。我的错。你的答案是正确的。

标签: r dataframe dplyr filter


【解决方案1】:

是的,使用新的辅助函数dplyr::if_all(),无论您有多少列,您都可以这样做:

trb %>% 
  filter(!(b == 1 & if_all(-b, ~ .x == 0)))

结果:

# A tibble: 4 x 3
      a     b     c
  <dbl> <dbl> <dbl>
1     1     1     1
2     1     1     0
3     1     0     1
4     0     0     0

!(b == 1 &amp; if_all(-b, ~ .x == 0)) 的故障:

  • b == 1 将匹配 b 为 1 的行
  • if_all(-b, ~ .x == 0) 将匹配除 b 之外的所有列都为 0 的行
  • !(b == 1 &amp; if_all(-b, ~ .x == 0)) 结合这两个表达式并删除两者都为真的行

【讨论】:

    【解决方案2】:
    trb %>%
      filter(b != 1 | rowSums(. == 1) != 1)
    # # A tibble: 4 x 3
    #       a     b     c
    #   <dbl> <dbl> <dbl>
    # 1     1     1     1
    # 2     1     1     0
    # 3     1     0     1
    # 4     0     0     0
    

    【讨论】:

      猜你喜欢
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 2022-01-12
      • 2016-08-23
      • 1970-01-01
      相关资源
      最近更新 更多