【问题标题】:Filter groups where all rows in a column are the same dplyr过滤组,其中列中的所有行都是相同的 dplyr
【发布时间】:2022-11-02 23:12:35
【问题描述】:

我试图做一些简单的事情。我的数据框如下所示:

ID    value
1       a
2       b
2       c
3       d
3       d
4       e
4       e
4       e

我想要做的是过滤具有多行且value 列中的所有值都相同的组:

df %>% group_by(ID) %>% filter(n() > 1 & all(mysterious_condition))

所以mysterious_condition 是我所缺乏的。我想要实现的是:

ID    value
3       d
3       d
4       e
4       e
4       e

关于如何做到这一点的任何想法?

谢谢!

【问题讨论】:

  • df %>% group_by(ID, value) %>% filter(n() > 1)
  • 基地R:df[ave(seq(nrow(df)), df[,c("ID","value")], FUN = length) > 1,]
  • 刚刚注意到将价值解释为一个小组工作,现在看到你提出了相同的@r2evans。谢谢!
  • @r2evans,如果有一个包含三行值 c(“a”,“a”,“b”)的组,则按 id 和 value 分组将保留“a”行,只删除“b”行。但是,如果我正确理解了 OP 的请求,则应该删除整个组。
  • 好点@mt1022

标签: r dplyr group-by


【解决方案1】:

我们可以使用n_distinct 来检查唯一元素的数量

library(dplyr)
df %>%
    group_by(ID) %>%
    filter(n() >1, n_distinct(value) == 1) %>%
    ungroup

-输出

# A tibble: 5 × 2
     ID value
  <int> <chr>
1     3 d    
2     3 d    
3     4 e    
4     4 e    
5     4 e    

数据

df <- structure(list(ID = c(1L, 2L, 2L, 3L, 3L, 4L, 4L, 4L), value = c("a", 
"b", "c", "d", "d", "e", "e", "e")), class = "data.frame", row.names = c(NA, 
-8L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多