删除出现x次R的ID

use*_*642 5 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
Run Code Online (Sandbox Code Playgroud)

示例输出

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
Run Code Online (Sandbox Code Playgroud)

提前致谢!

the*_*ail 6

这是data.table使用内置.N值的解决方案,如?data.table帮助文件中所述:‘.N’ is an integer, length 1, containing the number of rows in the group.

#create a similar reproducible exmaple
library(data.table)
dat <- data.table(names=rep(letters[1:3],c(5,5,3)),var=1:13)
Run Code Online (Sandbox Code Playgroud)

删除行:

dat[, cnt:=.N, by=names][cnt >= 5]
Run Code Online (Sandbox Code Playgroud)

虽然我觉得必须有一种方法可以在不分配新变量的情况下做到这一点。...现在在评论中感谢@mnel:

dat[,if(.N>=5).SD,by=names]
Run Code Online (Sandbox Code Playgroud)

如果组中的行数大于或等于 5,这实际上.SDby组的每个值返回一个子数据表.N。 它几乎等同于更传统的 R 子集语法:

dat[,.SD[.N >= 5],by=names]
Run Code Online (Sandbox Code Playgroud)

  • `dat[,if(.N&gt;=5).SD,by=names]` (3认同)

Rol*_*and 5

你可以table像这样使用:

df[df$names %in% names(table(df$names))[table(df$names) >= 5],]
Run Code Online (Sandbox Code Playgroud)

  • 很棒的东西。谢谢。只是为了强调,直接出现在 %in% 之后的“名称”是函数语法的一部分,并不引用我的 df.txt 中名为“名称”的列。 (2认同)