返回带有多次出现的列值的df

时间:2014-07-01 05:52:33

标签: r dataframe subset

我有一个数据框df,我正在尝试将列B中具有值的所有行子集在数据集中多次出现。

我尝试使用表来执行此操作,但是从表中进行子集化时遇到了问题:

t<-table(df$B)

然后我尝试使用以下方法对其进行分组:

subset(df, table(df$B)>1)

我收到错误

  

&#34; x中的错误[子集&amp; !is.na(子集)]:     对象类型&#39;关闭&#39;不是子集表格&#34;

如何使用表计数对数据框进行子集化?

3 个答案:

答案 0 :(得分:20)

这是一个dplyr解决方案(使用mrFlick&#39; data.frame)

library(dplyr)
newd <-  dd %>% group_by(b) %>% filter(n()>1) #
newd
#    a b 
# 1  1 1 
# 2  2 1 
# 3  5 4 
# 4  6 4 
# 5  7 4 
# 6  9 6 
# 7 10 6 

或者,使用data.table

setDT(dd)[,if(.N >1) .SD,by=b]

或使用基础R

dd[dd$b %in% unique(dd$b[duplicated(dd$b)]),]

答案 1 :(得分:6)

我是否可以使用data.table建议另一种更快捷的方法?

require(data.table) ## 1.9.2
setDT(df)[, .N, by=B][N > 1L]$B

(或)您可以将.I(另一个特殊变量 - 请参阅?data.table)与df中的相应行号以及.N结合使用,如下所示:< / p>

setDT(df)[df[, .I[.N > 1L], by=B]$V1]

(或)查看@ mnel的另一个变体(使用另一个特殊变量.SD)。

答案 2 :(得分:5)

使用table()并不是最好的,因为您必须将其重新加入data.frame的原始行。 ave函数可以更轻松地计算不同组的行级值。例如

dd<-data.frame(
    a=1:10,
    b=c(1,1,2,3,4,4,4,5,6, 6)
)


dd[with(dd, ave(b,b,FUN=length))>1, ]
#subset(dd, ave(b,b,FUN=length)>1)    #same thing

    a b
1   1 1
2   2 1
5   5 4
6   6 4
7   7 4
9   9 6
10 10 6

此处,对于b的每个级别,它会计算b的长度,这实际上只是b的数量,并将其返回到相应的每个值的行。然后我们将其用于子集。