按重复次数对数据帧进行子集

时间:2013-05-16 11:38:43

标签: r

如果我有这样的数据框:

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的水平出现超过三次的值,那么最快的方式是什么?

非常感谢,在之前的问题中没有找到正确的答案。

4 个答案:

答案 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]

(c.f。Subset by group with data.table