假设我有这样的数据集:
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
有一种简单的方法吗?
答案 0 :(得分:2)
@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
答案 1 :(得分: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
答案 2 :(得分:0)
不是一个非常优雅的答案,但它仍然有效。
我的方法是先table()
制作一个频率表
然后使用df merge
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