2016-11-15 9 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から共通の要素を持っている行のみが欲しい、これがある:dplyr::intersectはそれを行うのと同じように見えます

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 

が、Col2以来とCol3の値が違うと、値が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) 

この背後にある論理は、あなたが一緒に2つのデータフレームを結合して、.id -parameterでsimultaniously ID列が含まれていることです。次に、Col1の値でグループ化し、それぞれの値に固有のIDがどれくらいあるかを確認します。一意のIDが1つしかないものは、両方のデータフレームに表示されません。

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

@Procrastinatusマクシムス:基地R有する溶液は単純として美しい

同様の論理がdata.tableパッケージに適用することができます。私は 'dplyr'で解決策を消化するのに時間を取る必要があります。ありがとう! – plperez

+0

@plperez短い説明を追加しました – Jaap

関連する問題