Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 返回具有多次出现的列值的df_R_Dataframe_Subset - Fatal编程技术网

R 返回具有多次出现的列值的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 >

我有一个数据帧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 > 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)]),]