【问题标题】:remove groups with sparse observations [duplicate]删除具有稀疏观察的组[重复]
【发布时间】:2014-05-28 03:06:37
【问题描述】:

假设我有一个这样的数据集:

 df <- data.frame(group = c(rep(1,3),rep(2,2), rep(3,2),rep(4,3),rep(5, 2)), score = c(30, 10, 22, 44, 6, 5, 20, 35, 2, 60, 14,5)) 

      group score
 1      1    30
 2      1    10
 3      1    22
 4      2    44
 5      2     6
 6      3     5
 7      3    20
 8      4    35
 9      4     2
 10     4    60
 11     5    14
 12     5     5

...

我想删除少于 3 个观察的组,预期结果应该是这样的:

      group score
 1      1    30
 2      1    10
 3      1    22
 4      4    35
 5      4     2
 6      4    60

有没有简单的方法来做到这一点?

【问题讨论】:

    标签: r


    【解决方案1】:

    @beginneR 我喜欢表格方法,但我认为你可以不用merge

    key <- !table(df[, 1]) < 3
    df[df[, 1] %in% names(key)[key], ]
    
    ##    group score
    ## 1      1    30
    ## 2      1    10
    ## 3      1    22
    ## 8      4    35
    ## 9      4     2
    ## 10     4    60
    

    【讨论】:

      【解决方案2】:

      这个解决方案应该可以正常工作。使用ave 获取每个group 的值的计数

      df[ ave(df$score,df$group, FUN=length) >=3  ,]
      
      #    group score
      # 1      1    30
      # 2      1    10
      # 3      1    22
      # 8      4    35
      # 9      4     2
      # 10     4    60
      

      【讨论】:

      • 甚至惊人的答案!
      【解决方案3】:

      不是一个非常优雅的答案,但它仍然有效。

      我的做法是先由table()做一个频率表 然后merge带有df的freq表,把那些freq少于3次的去掉。

      freqtable <- data.frame(table(df$group))
      colnames(freqtable) <- c("group","freq")
      
      mergetable <- merge(df, freqtable, by="group")
      output <- mergetable[mergetable$freq>=3,][,1:2]
      

      输出是

      > output
         group score
      1      1    30
      2      1    10
      3      1    22
      8      4    35
      9      4     2
      10     4    60
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-12
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多