我有一个数据框df,我正在尝试将列B
中具有值的所有行子集在数据集中多次出现。
我尝试使用表来执行此操作,但是从表中进行子集化时遇到了问题:
t<-table(df$B)
然后我尝试使用以下方法对其进行分组:
subset(df, table(df$B)>1)
我收到错误
&#34; x中的错误[子集&amp; !is.na(子集)]: 对象类型&#39;关闭&#39;不是子集表格&#34;
如何使用表计数对数据框进行子集化?
答案 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
的数量,并将其返回到相应的每个值的行。然后我们将其用于子集。