删除出现x次R的ID

时间:2013-08-18 18:55:36

标签: r rows

我有一个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

提前致谢!

3 个答案:

答案 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, ]