我有以下数据框
mydf<- data.frame(c(1,1,3,4,5,6),
c(1,1,3,10,20,30),
c(1,10,20,20,15,10))
colnames(mydf)<-c( "ID1","ID2", "ID3")
让我们计算两次出现的mydf$ID1
和mydf$ID2
实例的数量
tmp<-plyr::ddply(mydf,c("ID1","ID2"),nrow)
tmp<-tmp[tmp$V1==2,]
这有以下输出(有两个相同的实例)
ID1 ID2 V1
1 1 1 2
现在我想提取这两个实例的剩余字段,即ID3
:
asd<-mydf[ (mydf$ID1 %in% tmp$ID1) & (mydf$ID1 %in% tmp$ID2), ]
这给了我以下
ID1 ID2 ID3
1 1 1 1
2 1 1 10
这完全是我想要的,也是我想要的,所以一切都很好。
然而,我的真实数据集不仅包含3个向量,如mydf
,而且包含300个。每个向量不仅仅是6个元素,而是+50.000
当我对我的数据运行上述方法时,我得到的条目实例不仅发生了2次,而且还发生了1,3,4等等。这意味着出了问题。
是否因为上述方法无法扩展到大数据?或者是因为我上面概述的方法本质上是错误的?
不幸的是,由于我的数据量很大,我无法在此发布。
更新:选择包含3个向量的列表作为示例。实际上我的数据有很多向量,但我仍然希望根据两个向量的副本对它们进行分组。一个例子:
library(dplyr)
mydf<- data.frame(c(1, 1, 3, 4, 5, 6,0),
c(22,22, 3,10,20,30,0),
c(2, 10,20,20,15,10,0),
c(3, 10,20,20,15,10,0),
c(4, 10,20,20,15,10,15),
c(5, 99,98,98,97,99,97))
colnames(mydf)<-c( "ID1","ID2", "ID3", "ID4", "ID5", "ID6")
(mydf %>% group_by(ID5, ID6) %>% filter(n()==2))
根据需要,这会产生
ID1 ID2 ID3 ID4 ID5 ID6
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 22 10 10 10 99
2 3 3 20 20 20 98
3 4 10 20 20 20 98
4 5 20 15 15 15 97
5 6 30 10 10 10 99
6 0 0 0 0 15 97
答案 0 :(得分:3)
我们可以使用dplyr
library(dplyr)
mydf %>%
group_by(ID1, ID2) %>%
filter(n()==2)
如果有超过2列作为分组变量,我们可以使用group_by_
mydf %>%
group_by_(.dots = names(mydf)[1:2]) %>%
filter(n()==2)
答案 1 :(得分:2)
基础R解决方案是使用ave
来计算重复计数,提取计数和子集,根据哪些是成对重复。
mydf[ave(mydf$ID3, mydf$ID1, mydf$ID2, FUN=length) == 2, ]
ID1 ID2 ID3
1 1 1 1
2 1 1 10
要将分组扩展为多个变量,您可以使用Reduce
和interaction
的输出替换ID1和ID2的显式列表,如下所示:
mydf[ave(mydf$ID3, Reduce(interaction, mydf[-3]), FUN=length) == 2, ]
ID1 ID2 ID3
1 1 1 1
2 1 1 10
这里,Reduce(interaction, mydf[-3])
构造一个因子变量,它是ID1和ID2的交互。这将很乐意采用您提供的尽可能多的向量。