R 返回具有多次出现的列值的df
我有一个数据帧df,我正在尝试对所有列R 返回具有多次出现的列值的df,r,dataframe,subset,R,Dataframe,Subset,我有一个数据帧df,我正在尝试对所有列B中有值的行进行子集,这些行在数据集中多次出现 我尝试使用table来执行此操作,但无法从表中进行子集设置: t<-table(df$B) 我得到了错误 “x[subset&!is.na(subset)]中的错误: “closure”类型的对象不可子集“ 如何使用表计数对数据帧进行子集划分?我可以推荐一种使用数据进行子集划分的更快的方法吗 require(data.table) ## 1.9.2 setDT(df)[, .N, by=B][N >
B
中有值的行进行子集,这些行在数据集中多次出现
我尝试使用table来执行此操作,但无法从表中进行子集设置:
t<-table(df$B)
我得到了错误
“x[subset&!is.na(subset)]中的错误:
“closure”类型的对象不可子集“
如何使用表计数对数据帧进行子集划分?我可以推荐一种使用
数据进行子集划分的更快的方法吗
require(data.table) ## 1.9.2
setDT(df)[, .N, by=B][N > 1L]$B
(或)您可以将.I
(另一个特殊变量-请参见?data.table
)与.N
耦合,该变量在df
中给出相应的行号,如下所示:
setDT(df)[df[, .I[.N > 1L], by=B]$V1]
(或者)看看@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
dd1,]
#子集(dd,ave(b,b,FUN=长度)>1)#相同
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
的数量,并将其返回到每个值的相应行。然后我们使用它来子集。这里是一个dplyr
解决方案(使用mrFlick的data.frame)
或者使用base R
dd[dd$b %in% unique(dd$b[duplicated(dd$b)]),]
我也在看plyr函数计数,但这会创建一个全新的数据帧。所有这些方法都会创建一个新的data.frame(或data.table)。R通常不会在适当的位置修改对象。你能解释一下.N吗?是的,当然。N返回每个组的计数(或长度)。此语法按B分组,并将计数显示为聚合的统计信息。然后,它通过计数大于1的B值进行过滤。如果您熟悉sql,这与此非常类似。df[where,select,groupby][having]@ChrisRobles-这里也有更多解释:带有(dd,dd[b%in%names(table(b))[table(b)>1],])
将允许您使用table
,尽管没有那么干净。对。我讨厌这样叫它两次。这是我可能使用函数的地方之一:dd[dd$b%in%withX(表(dd$b),名称(X[X>1]),]
。或者您甚至可以使用名称(Filter(函数(x)x>1,table(dd$b))
来获取名称。但这仍然会使他们转变为性格。但这就是为什么我说它“不是最好的”,而不是不可能的。dd%>%group_by(b)%>%filter(n()>1)也应该起作用。或dd%>%分组依据(b)%>%筛选器(长度(行编号())>1)
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
setDT(dd)[,if(.N >1) .SD,by=b]
dd[dd$b %in% unique(dd$b[duplicated(dd$b)]),]