我有一个df,我想删除df中行数少于X的人。例如,在这个玩具示例中,我想留住那些> = 5行的人。
df
names fruit
4 john kiwi
7 john apple
9 john banana
13 john orange
14 john apple
2 mary orange
5 mary apple
8 mary orange
10 mary apple
12 mary apple
1 tom apple
3 tom banana
6 tom apple
11 tom kiwi
示例输出
df
names fruit
4 john kiwi
7 john apple
9 john banana
13 john orange
14 john apple
2 mary orange
5 mary apple
8 mary orange
10 mary apple
12 mary apple
提前致谢!
答案 0 :(得分:5)
您可以像这样使用table
:
df[df$names %in% names(table(df$names))[table(df$names) >= 5],]
答案 1 :(得分:4)
以下是使用内置data.table
值的.N
解决方案,如?data.table
帮助文件中所述: ‘.N’ is an integer, length 1, containing the number of rows
in the group.
< / p>
#create a similar reproducible exmaple
library(data.table)
dat <- data.table(names=rep(letters[1:3],c(5,5,3)),var=1:13)
删除行:
dat[, cnt:=.N, by=names][cnt >= 5]
虽然我觉得必须有一种方法可以在不指定新变量的情况下执行此操作。 ...现在感谢评论中的@mnel:
dat[,if(.N>=5).SD,by=names]
如果组.SD
中的行数大于或等于5,则本质上会为by
组的每个值返回一个sub-data.table .N
。几乎相当于更传统的R子集化语法:
dat[,.SD[.N >= 5],by=names]
答案 2 :(得分:0)
另一种解决方案是使用 subset()
命令,如下所示:
subset(df, ave(names, names, FUN = length) >= 5)
或者,
df[ave(df$names, df$names, FUN = length) >= 5, ]