r - 如何删除少于 n 个成员的因子

标签 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  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

然后确定要保留的 ID,并保留这些行。这会产生期望的结果,但是有更好的方法吗?

idsToKeep <- as.numeric(names(keepFactors[which(keepFactors)]))
DT[DT$id %in% idsToKeep,]

最佳答案

由于您从 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

在基础 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

关于r - 如何删除少于 n 个成员的因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27048993/

相关文章:

r - 为什么 file.exists 尽管位于 list.files 中却返回 FALSE?

python - 组内条件计数

R - 用变量对重新组织一个熔化的 data.frame

r - 使用 NSE 在函数中调用 ggplot

r - R可以自动识别并统计一个单词在n列中出现的次数吗?

wpf - 在上下文菜单中分组

php - 对多维数组中的行进行分组,并对每组中的 "count"个元素求和

javascript - 如何在 JavaScript 中对这个对象数组进行分组或合并?

javascript - 组单击时分组网格折叠组

r - 在ggplot2之上覆盖基本R图形