R 如何删除成员数少于n的因子

R 如何删除成员数少于n的因子,r,grouping,R,Grouping,有没有办法从数据表中删除行数少于N行(如N=5)的因子 数据: DT = data.table(x=rep(c("a","b","c"),each=6), y=c(1,3,6), v=1:9, id=c(1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4)) 目标:当id数小于5时删除行。变量“id”是分组变量,当组中的行数小于5时,要删除的组。在DT中,需要确定哪些组的成员少于5个(组“1”和“4”),然后删除这些行 1: a 3 5

有没有办法从数据表中删除行数少于N行(如N=5)的因子

数据:

DT = data.table(x=rep(c("a","b","c"),each=6), y=c(1,3,6), v=1:9, 
                id=c(1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4))
目标:当id数小于5时删除行。变量“id”是分组变量,当组中的行数小于5时,要删除的组。在DT中,需要确定哪些组的成员少于5个(组“1”和“4”),然后删除这些行

 1: a 3 5  2
 2: b 6 6  2
 3: b 1 7  2
 4: b 3 8  2
 5: b 6 9  2
 6: b 1 1  3
 7: c 3 2  3
 8: c 6 3  3
 9: c 1 4  3
10: c 3 5  3
11: c 6 6  3
这里有一个方法

获取因子的长度,以及要保留的因子

nFactors<-tapply(DT$id,DT$id,length)
keepFactors <- nFactors >= 5

nFactors因为您是从
data.table
开始的,所以第一部分使用
data.table
语法

编辑:感谢Arun(评论)帮助我改进此数据表答案

DT[DT[, .(I=.I[.N>=5L]), by=id]$I]
#     x y v id
#  1: a 3 5  2
#  2: a 6 6  2
#  3: b 1 7  2
#  4: b 3 8  2
#  5: b 6 9  2
#  6: b 1 1  3
#  7: b 3 2  3
#  8: b 6 3  3
#  9: c 1 4  3
# 10: c 3 5  3
# 11: c 6 6  3
在base R中,您可以使用

df <- data.frame(DT)
tab <- table(df$id)
df[df$id %in% names(tab[tab >= 5]), ]
#    x y v id
# 5  a 3 5  2
# 6  a 6 6  2
# 7  b 1 7  2
# 8  b 3 8  2
# 9  b 6 9  2
# 10 b 1 1  3
# 11 b 3 2  3
# 12 b 6 3  3
# 13 c 1 4  3
# 14 c 3 5  3
# 15 c 6 6  3

df如果不需要使用
数据表,可以使用
dplyr

library(dplyr)

data.frame(DT) %>%
  group_by(id) %>%
  filter(n() >= 5)

分组变量为“id”,应删除少于5行的组。在本例中,组“1”和“4”被删除。聚合不需要键
DT[,.SD[.N>=5L],by=id]
将是理想的方法。但在速度优化之前,
DT[DT[,(I=.I[.N>=5L]),by=id]$I]
如果我记得以前的讨论,如果使用
.SD
语法,
DT[,If(.N>=5).SD,by=id]
也会稍微快一些。
library(dplyr)

data.frame(DT) %>%
  group_by(id) %>%
  filter(n() >= 5)