根据条件

时间:2017-03-31 15:43:34

标签: r dataframe subset

我有以下数据框

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$ID1mydf$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

2 个答案:

答案 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

要将分组扩展为多个变量,您可以使用Reduceinteraction的输出替换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的交互。这将很乐意采用您提供的尽可能多的向量。