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

Chr*_*les 9 r subset dataframe

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

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

t<-table(df$B)
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用以下方法对其进

subset(df, table(df$B)>1)
Run Code Online (Sandbox Code Playgroud)

我得到了错误

"x [subset&!is.na(subset)]中的错误:'closure'类型的对象不是子集"

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

mne*_*nel 23

这是一个dplyr解决方案(使用mrFlick的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 
Run Code Online (Sandbox Code Playgroud)

或者,使用data.table

setDT(dd)[,if(.N >1) .SD,by=b]
Run Code Online (Sandbox Code Playgroud)

或使用基地R.

dd[dd$b %in% unique(dd$b[duplicated(dd$b)]),]
Run Code Online (Sandbox Code Playgroud)

  • dd%>%group_by(b)%>%filter(n()> 1)#should也可以.或者dd%>%group_by(b)%>%filter(length(row_number())> 1) (2认同)

Mik*_*han 6

我可以建议另一种更快的方法data.table吗?

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

(或)你可以耦合.I(另一个特殊变量 - 见?data.table),它给出相应的行号df,以及.N如下:

setDT(df)[df[, .I[.N > 1L], by=B]$V1]
Run Code Online (Sandbox Code Playgroud)

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


MrF*_*ick 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
Run Code Online (Sandbox Code Playgroud)

在这里,对于每个级别b,它计算长度b,它实际上只是b's 的数量,并返回到每个值的适当行.然后我们用它来子集.