如果我有这样的数据框:
neu <- data.frame(test1 = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14),
test2 = c("a","b","a","b","c","c","a","c","c","d","d","f","f","f"))
neu
test1 test2
1 1 a
2 2 b
3 3 a
4 4 b
5 5 c
6 6 c
7 7 a
8 8 c
9 9 c
10 10 d
11 11 d
12 12 f
13 13 f
14 14 f
我想只选择那些因子test2
的水平出现超过三次的值,那么最快的方式是什么?
非常感谢,在之前的问题中没有找到正确的答案。
答案 0 :(得分:7)
使用以下方式查找行:
z <- table(neu$test2)[table(neu$test2) >= 3] # repeats greater than or equal to 3 times
或者:
z <- names(which(table(neu$test2)>=3))
然后用:
子集subset(neu, test2 %in% names(z))
或者:
neu[neu$test2 %in% names(z),]
答案 1 :(得分:5)
这是另一种方式:
with(neu, neu[ave(seq(test2), test2, FUN=length) > 3, ])
# test1 test2
# 5 5 c
# 6 6 c
# 8 8 c
# 9 9 c
答案 2 :(得分:3)
我会使用count
包中的plyr
来执行计数:
library(plyr)
count_result = count(neu, "test2")
matching = with(count_result, test2[freq > 3])
with(neu, test1[test2 %in% matching])
[1] 5 6 8 9
答案 3 :(得分:2)
(更好的缩放)data.table
方式:
library(data.table)
dt = data.table(neu)
dt[dt[, .I[.N >= 3], by = test2]$V1]
注意:希望将来,以下更简单的语法将是快速执行此操作的方法:
dt[, .SD[.N >= 3], by = test2]