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)
我可以建议另一种更快的方法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).
使用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 的数量,并返回到每个值的适当行.然后我们用它来子集.
| 归档时间: |
|
| 查看次数: |
12277 次 |
| 最近记录: |