【问题标题】:Remove groups with only one individual in R without using dplyr package [duplicate]在不使用 dplyr 包的情况下删除 R 中只有一个人的组 [重复]
【发布时间】:2021-10-12 15:18:00
【问题描述】:

考虑以下数据集。数据按每组一或两个人分组。但是,一个人可能有多个条目。

group<-c(1,1,1,1,2,2,3,3,3,3,4,4)
individualID<-c(1,1,2,2,3,3,5,5,6,6,7,7)
X<-rbinom(12,1,0.5)
df1<-data.frame(group,individualID,X)
> df1
   group individualID X     
1      1            1  0 
2      1            1  1 
3      1            2  1 
4      1            2  1 
5      2            3  1 
6      2            3  1 
7      3            5  1 
8      3            5  1 
9      3            6  1 
10     3            6  1 
11     4            7  0 
12     4            7  1 

从上述第 1 组和第 3 组有 2 个人,而第 2 组和第 4 组各有 1 个人。

> aggregate(data = df1,  individualID ~ group, function(x) length(unique(x)))
group individualID 
1 1    2
2 2    1
3 3    2
4 4    1

如何在不使用 dplyr 包的情况下对数据进行子集化,以仅拥有超过 1 个个人的组。即省略有 1 个人的组。

我最终应该只有第 1 组和第 3 组。

【问题讨论】:

    标签: r


    【解决方案1】:

    或者另一种选择是tidyverse - 在按“组”分组后,filter“individualID”中不同 (n_distinct) 元素的数量大于 1 的行

    library(dplyr)
    df1 %>%
        group_by(group) %>% 
        filter(n_distinct(individualID) > 1) %>%
        ungroup
    # A tibble: 8 × 3
      group individualID     X
      <dbl>        <dbl> <int>
    1     1            1     0
    2     1            1     0
    3     1            2     1
    4     1            2     1
    5     3            5     0
    6     3            5     0
    7     3            6     1
    8     3            6     0
    

    或者使用subsetave 来自base R

    subset(df1, ave(individualID, group, FUN = function(x) length(unique(x))) > 1)
       group individualID X
    1      1            1 0
    2      1            1 0
    3      1            2 1
    4      1            2 1
    7      3            5 0
    8      3            5 0
    9      3            6 1
    10     3            6 0
    

    【讨论】:

      【解决方案2】:

      当然还有更简洁的方法,但这里是大体思路。

      # use your code to get the counts by group
      df1_counts <- aggregate(data = df1,  individualID ~ group, function(x) length(unique(x)))
      
      # create a vector of groups where the count is > 1
      keep_groups <- df1_counts$group[df1_counts$individualID > 1]
      
      # filter the rows to only groups you want to keep
      df1[df1$group %in% keep_groups,]
      #    group individualID X
      # 1      1            1 0
      # 2      1            1 0
      # 3      1            2 1
      # 4      1            2 0
      # 7      3            5 1
      # 8      3            5 1
      # 9      3            6 0
      # 10     3            6 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 2015-06-14
        • 2011-05-22
        • 1970-01-01
        • 2018-07-15
        • 1970-01-01
        相关资源
        最近更新 更多