删除具有少于三个唯一观察值的组
Posted
技术标签:
【中文标题】删除具有少于三个唯一观察值的组【英文标题】: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 标记。你能解释一下吗?谢谢。
【参考方案1】:
使用data.table,您可以这样做:
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))),]
【讨论】:
以上是关于删除具有少于三个唯一观察值的组的主要内容,如果未能解决你的问题,请参考以下文章