10行3列的框架
a b c
1 1 201 1
2 2 202 1
3 3 203 1
4 4 204 1
5 5 205 4
6 6 206 5
7 7 207 4
8 8 208 4
9 9 209 8
10 10 210 5
我想删除列“c”中相同值重复少于3次的所有行。 在这个例子中,我想删除第6,9和10行。(我的真实data.frame有5000行和25列) 我尝试使用函数rle来做,但我一直得到错误的解决方案。 任何帮助?谢谢!
答案 0 :(得分:14)
Data[Data$c %in% names(which(table(Data$c) > 2)), ]
答案 1 :(得分:4)
如果我错了,请纠正我,但似乎你想要列c中的值出现两次以上的所有行。 “重复”让我觉得它们需要连续发生,这就是rle
的用途,但如果那是你想做的事情,你只需要1-4行。
也就是说,下面的代码找到列c中的值出现超过2次的行。我确信这可以更优雅地完成,但它确实有效。
lines <-
"a b c
1 201 1
2 202 1
3 203 1
4 204 1
5 205 4
6 206 5
7 207 4
8 208 4
9 209 8
10 210 5"
Data <- read.table(con <- textConnection(lines), header=TRUE); close(con)
cVals <- data.frame(table(Data$c))
Rows <- Data$c %in% cVals[cVals$Freq > 2,1]
Data[Rows,]
# a b c
#1 1 201 1
#2 2 202 1
#3 3 203 1
#4 4 204 1
#5 5 205 4
#7 7 207 4
#8 8 208 4
答案 2 :(得分:2)
使用unsplit可能是投影分组聚合的最简单方法(在这种情况下使用表来获取计数,但请参见tapply一般情况)到原始数据。
subset(Data, with(Data, unsplit(table(c), c)) >= 3)
与Erik's相同且更相似:
Data[unsplit(table(Data$c), Data$c) >= 3, ]
答案 3 :(得分:1)
以下是使用ave
的解决方案:
Data[ave(Data$c, Data$c, FUN = length) > 2, ]
或将ave
与subset
一起使用:
subset(Data, ave(c, c, FUN = length) > 2)