【问题标题】:Remove groups with less than three unique observations删除具有少于三个唯一观察值的组
【发布时间】:2016-10-16 13:52:07
【问题描述】:

我想对我的数据框进行子集化,以仅保留在不同日期有 3 个或更多观察值的组。我想摆脱少于 3 个观察值的组,或者他们的观察结果不是来自 3 个不同的日子。

这是一个示例数据集:

Group   Day
1       1 
1       3
1       5
1       5
2       2
2       2  
2       4 
2       4
3       1
3       2
3       3
4       1
4       5

因此,对于上面的示例,组 1 和组 3 将被保留,组 2 和组 4 将从数据框中删除。

我希望这是有道理的,我想解决方案会很简单,但我无法解决(我对 R 很陌生,并且不能很快找到解决此类问题的方法)。我想也许 diff 函数可以派上用场,但没有走得更远。

【问题讨论】:

  • 试试df[df$Group %in% as.numeric(names(which(tapply(df$Day,df$Group,function(x) length(unique(x))>=3)))),]
  • @Jaap 这个r-faq 怎么样?我无法理解所有关于 r-faq 的内容。当然,还有更一般的、访问量更大的问题没有用 r-faq 标记。你能解释一下吗?谢谢。

标签: r subset r-faq


【解决方案1】:

使用,您可以这样做:

library(data.table)
DT[, if(uniqueN(Day) >= 3) .SD, by = Group]

给出:

   Group Day
1:     1   1
2:     1   3
3:     1   5
4:     1   5
5:     3   1
6:     3   2
7:     3   3

或者dplyr:

library(dplyr)
DT %>% 
  group_by(Group) %>% 
  filter(n_distinct(Day) >= 3)

给出相同的结果。

【讨论】:

    【解决方案2】:

    一个想法使用dplyr

     library(dplyr)
     df %>% 
       group_by(Group) %>% 
       filter(length(unique(Day)) >= 3)
    
    #Source: local data frame [7 x 2]
    #Groups: Group [2]
    
    #  Group   Day
    #  (int) (int)
    #1     1     1
    #2     1     3
    #3     1     5
    #4     1     5
    #5     3     1
    #6     3     2
    #7     3     3
    

    【讨论】:

    • 而不是length(unique(Day)) 你可以n_distinct(day)
    • 不错的一个!谢谢@Arun
    • @ProcrastinatusMaximus,我没有看到您使用dplyr 解决方案进行了更新。我还是添加了unique(length)) 方法。
    • np,有几个选项总是好的 ;-)(顺便说一句:不需要过滤器语句中的 .,,我冒昧地删除了它;希望你不介意)
    • 谢谢@ProcrastinatusMaximus :)
    【解决方案3】:

    我们可以使用base R

    i1 <-  rowSums(table(df1)!=0)>=3
    subset(df1, Group %in% names(i1)[i1])
    #    Group Day
    #1      1   1
    #2      1   3
    #3      1   5
    #4      1   5
    #9      3   1
    #10     3   2
    #11     3   3
    

    或者单行 base R 将是

    df1[with(df1, as.logical(ave(Day, Group, FUN = function(x) length(unique(x)) >=3))),]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多