【问题标题】:count observations by group and keep only those belonging to at least two groups [duplicate]按组计算观察结果并仅保留属于至少两个组的观察结果[重复]
【发布时间】:2015-09-16 14:59:04
【问题描述】:

我有以下数据框:

id    group
1     A
1     B
1     C
2     A
3     A
3     B

我想创建一个变量来计算每个人所属的组数,并基于此变量,我只想将那些拥有多个组的人保留在数据框中。在这种情况下 id 2 将被删除。我知道我可以通过做来数数

table(data$group)

但我无法使用它来删除只有一组的人。

【问题讨论】:

    标签: r


    【解决方案1】:

    假设 OP 只需要保留“组”中 unique 元素的 length 大于 1 的“id”,我们可以使用 data.table。我们将'data.frame'转换为'data.table'(setDT(data)),按'ID'分组,我们返回Data.table的子集(.SDiflengthunique 'group' 中的元素大于 1。(uniqueNlength(unique(. 的方便包装)

     library(data.table)#v1.9.5+
     setDT(data)[,if(uniqueN(group)>1) .SD , by = id]
     #   id group
     #1:  1     A
     #2:  1     B
     #3:  1     C
     #4:  3     A
     #5:  3     B
    

    注意:如果这仅基于 length,我们将 uniqueN(group)>1 替换为 length(group)>1


    我们是否可以仅使用“id”列进行子集化还是需要“group”列中的length(unique,尚不完全清楚。如果我们只使用'id',一个选项是duplicated

    data[duplicated(data$id)|duplicated(data$id, fromLast=TRUE),]
    #  id group
    #1  1     A
    #2  1     B
    #3  1     C
    #5  3     A
    #6  3     B
    

    【讨论】:

    • 我收到以下错误:找不到函数“uniqueN”。我猜是因为在 install.packages("data.table") 我得到 data.table 1.9.4 或者我需要调用另一个库?
    • @user2246905 我使用的是开发版。但你可以替换为length(unique(group))>1
    • @user2246905 我有疑问。假设如果您有一个带有 3 个元素的“id”1,并且所有组元素都是“A”。你会删除它吗?
    【解决方案2】:
    df[df$id %in% names(which(table(df$id) > 1)),]
    #  id group
    #1  1     A
    #2  1     B
    #3  1     C
    #5  3     A
    #6  3     B
    

    使用table 方法,您可以检查哪些ID 出现了多次。假设一个 id 每组出现一次。

    更新

    df[df$id %in% names(which(rowSums(!!(table(df$id, df$group))) > 1)),]
    

    我添加了对第二列的引用,以防同一个 id 出现多个值。

    【讨论】:

      【解决方案3】:

      使用 dplyr:

      library(dplyr)
      df %>%
        group_by(id) %>%
        filter(length(group) > 1)
      

      @Frank 建议

      或者,如果您想检查唯一性(组)而不是长度(组):

      df %>%
        group_by(id) %>%
        filter(n_distinct(group) > 1)
      

      【讨论】:

      • 并将其扩展到 akrun 正在解决的情况,n_distinct(group)>1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      相关资源
      最近更新 更多