【问题标题】:Filter by subgroup criteria (specify the occurrence of a value per group) using dplyr使用 dplyr 按子组条件过滤(指定每组值的出现)
【发布时间】:2019-08-11 09:22:50
【问题描述】:

我想过滤一个数据集并保留所有恰好有 n 行(在我的情况下为 1 行)的组与特定项目。

df <- tibble(group=c("a","a","a","b","b","b"),
        item=c(1,2,2,1,1,3))

我知道如何使用 any 过滤所有包含至少 1 个 1 项的组

df %>% group_by(group) %>% 
  filter(any(item==1))

但是,我不知道是否可以指定每个组的出现次数。 我想到了这样的事情:

filter(n(item==1)==1)
filter(any(item==1,1))

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    我们可以group_bygroup 并计算每个组中item == 1filter 的出现次数,其中&gt;= n 出现次数。

    library(dplyr)
    n <- 1
    
    df %>%
      group_by(group) %>%
      filter(sum(item == 1) >= n)
    

    或者使用与base R相同的逻辑ave

    df[with(df, ave(item == 1, group, FUN = sum) >= n), ]
    

    为了完成一个data.table

    library(data.table)
    setDT(df)[, if(sum(item == 1) >= n) .SD, by = group]
    

    【讨论】:

      【解决方案2】:

      我们可以通过直接子集来使用data.table

      library(data.table)
      n <- 1
      setDT(df)[, .SD[sum(item == 1) >= n], by = group]
      

      或使用length

      library(dplyr)
      df %>%
         group_by(group) %>% 
         filter(length(item[item==1]) >= n)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        • 2019-10-20
        • 2021-10-25
        • 2015-05-27
        • 2021-03-28
        • 1970-01-01
        相关资源
        最近更新 更多