2017-03-31 112 views
1

我有以下的數據幀子集列表元素條件

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等等。所以這意味着什麼是錯的。

是否因爲上述方法無法擴展到大數據?還是因爲我上面概述的方法本質上是錯誤的?

不幸的是,由於我的數據量很大,我無法在此發佈。


UPDATE:經與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 
+1

你的代碼中的錯誤是'(mydf $ ID1%in%tmp $ ID2)',應該是'(mydf $ ID2%in%tmp $ ID2)'我想。 – lmo

+0

謝謝,這只是在這個例子中的錯字 – BillyJean

回答

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) 
+0

謝謝,我會給我一個關於我的數據。但是你在我的嘗試中看到錯誤嗎? – BillyJean

+0

@BillyJean您是否說過您在帖子中使用您的方法獲得了預期的輸出結果?在'ddply'旁邊會很慢,兩步過程真的變慢了 – akrun

+0

我上面寫的方法在我自己的數據上使用它時並不能給我預期的輸出。但是,當我在乾淨的「小」數據上使用它時,它會起作用。 – BillyJean

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的交互。這將愉快地採取儘可能多的載體,你提供。

+0

的操作組謝謝。這怎麼可以推廣到一個列表與'm'向量,而不僅僅是3? – BillyJean

+0

謝謝。我的意思是我仍然想計算ID1和ID2的重複計數,但現在我想提取的所有其他行都是ID3,ID4,ID5等。對不起,如果我以前的評論不清楚。 – BillyJean

+1

原件應該適用於兩個ID矢量和無限其他矢量。根據'[]'中的規則,'df ['在開始時表示子集df'')。使用邏輯向量將子集化應用於df中的所有向量。如果您的示例中未包含其他複雜功能。請考慮提出一個新問題。如果它只是一些小事,那麼可能會發表第二個例子。 – lmo