5

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

提前致谢!

4

3 回答 3

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)

删除行:

dat[, cnt:=.N, by=names][cnt >= 5]

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

dat[,if(.N>=5).SD,by=names]

如果组中的行数大于或等于 5,这实质上会为组.SD的每个值返回一个 sub-data.table 。它几乎等同于更传统的 R 子集语法:by.N

dat[,.SD[.N >= 5],by=names]
于 2013-08-19T00:04:04.973 回答
5

你可以table这样使用:

df[df$names %in% names(table(df$names))[table(df$names) >= 5],]
于 2013-08-18T19:02:38.920 回答
0

另一种解决方案可能是使用如下subset()命令:

subset(df, ave(names, names, FUN = length) >= 5)

或者,

df[ave(df$names, df$names, FUN = length) >= 5, ]
于 2021-06-14T05:22:49.587 回答