我有一个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)
提前致谢!
这是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,这实际上.SD为by组的每个值返回一个子数据表.N。 它几乎等同于更传统的 R 子集语法:
dat[,.SD[.N >= 5],by=names]
Run Code Online (Sandbox Code Playgroud)
你可以table像这样使用:
df[df$names %in% names(table(df$names))[table(df$names) >= 5],]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2217 次 |
| 最近记录: |