2016-11-15 13 views
2

我想我遇到了(據我所知)沒有被真棒dplyr庫完全覆蓋的情況,所以我想它會需要更多的編碼比我的能力。我有以下2個數據幀:將數據框與列常用列名相結合,但在列中使用不同的值

df1 = 
    Col1 Col2 Col3 
1 A 1 X 
2 A 1 X 
3 B 1 X 
4 C 1 X 
5 D 1 Y 
6 D 1 Z 

df2 = 

    Col1 Col2 Col3 
1 A 2 X 
2 B 2 Y 
3 C 2 Y 
4 G 2 Z 
5 H 2 X 
6 I 2 Z 

我只想要行具有僅Col1共同的元素,這就是:

out = 
    Col1 Col2 Col3 
1 A 1 X 
2 A 1 X 
3 B 1 X 
4 C 1 X 
5 A 2 X 
6 B 2 Y 
7 C 2 Y 

它看起來像dplyr::intersect將做到這一點,但由於Col2Col3有不同的值,它給了我0表的值。非常感謝您的指導。謝謝。 P.佩雷斯。

回答

1

隨着基礎R你可以這樣做:

common <- intersect(df1$Col1, df2$Col1) 

df3 <- rbind(df1, df2) 
df3[df3$Col1 %in% common, ] 

這給:

Col1 Col2 Col3 
1  A 1 X 
2  A 1 X 
3  B 1 X 
4  C 1 X 
11 A 2 X 
21 B 2 Y 
31 C 2 Y 

而且隨着dplyr

bind_rows(df1, df2) %>% 
    filter(Col1 %in% intersect(df1$Col1, df2$Col1)) 

,這將給你相同的輸出。從註釋通過@Frank的替代:

bind_rows(df1, df2, .id = "id") %>% 
    group_by(Col1) %>% 
    filter(n_distinct(id) == 2L) 

這背後的邏輯是,你兩個dataframes結合在一起,幷包括與.id -parameter的同時放ID列。然後按Col1的值進行分組,並檢查每個值有多少唯一的ID。只有一個唯一標識的標識不會出現在兩個數據框中。

類似的邏輯可以與data.table包被應用:

library(data.table) 
rbindlist(list(df1, df2), idcol = 'id')[, if (uniqueN(id) == 2L) .SD, by = Col1] 
+0

@Procrastinatus鮃:用鹼R中的溶液是美麗一樣簡單。儘管如此,我需要花一些時間來用「dplyr」消化解決方案。謝謝! – plperez

+0

@plperez添加了一個簡短的解釋 – Jaap

相關問題