2017-12-14 13 views
0

rのコードで排他的な完全結合を実装しようとしています。排他的完全な結合でr

Exclusive Full Join Image.

は正常に動作しますが、フィルターが条件の多くを満たしているので、正しいアプローチであり、以下のコードを実装しました。これはサンプルコードであるため、多くの列は追加されませんでしたが、リアルタイムのシナリオでは多くの列があり、フィルタリングするために列を追加すると処理が難しくなります。

その他の方法はありますか?

library(tidyverse) 

persons = data.frame(
    name = c("Ponting", "Clarke", "Dave", "Bevan"), 
    age = c(24, 32, 26, 29), 
    col1 = c(1,2,3,4), 
    col2 = c("a", "z", "h", "p") 
) 

person_sports = data.frame(
    name = c("Ponting", "Dave", "Roshan"), 
    sports = c("soccer", "tennis", "boxing"), 
    rank = c(8, 4, 1), 
    col3 = c("usa", "australia", "england"), 
    col4 = c("a", "f1", "z2") 
) 

persons %>% full_join(person_sports, by = c("name")) %>% 
    filter((is.na(age) & is.na(col1) & is.na(col2)) | (is.na(sports) & is.na(rank) & is.na(col3) & is.na(col4))) 

出力:

enter image description here

答えて

2

complete.casesを使用してみてください。 TRUE/FALSEのベクトルを返します。ここで、FALSEは、少なくとも1つの列の特定の行にNAがあることを示します。

persons %>% full_join(person_sports, by = c("name")) %>% .[!complete.cases(.), ] 
#  name age col1 col2 sports rank col3 col4 
# 2 Clarke 32 2 z <NA> NA <NA> <NA> 
# 4 Bevan 29 4 p <NA> NA <NA> <NA> 
# 5 Roshan NA NA <NA> boxing 1 england z2 

上記と同様に動作する代替として、dplyrパッケージからfilter_allany_varsを使用します。

persons %>% full_join(person_sports, by = c("name")) %>% filter_all(any_vars(is.na(.))) 
#  name age col1 col2 sports rank col3 col4 
# 1 Clarke 32 2 z <NA> NA <NA> <NA> 
# 2 Bevan 29 4 p <NA> NA <NA> <NA> 
# 3 Roshan NA NA <NA> boxing 1 england z2 

あなたは、実際のデータセットがはるかに大きい言及したので、最後に、あなたはdata.tableソリューションと比較して、実世界のデータで最高の作品かを確認したい場合があります。

library(data.table) 
setDT(persons) 
setDT(person_sports) 

merge(persons, person_sports, by = "name", all = TRUE) %>% .[!complete.cases(.)] 
#  name age col1 col2 sports rank col3 col4 
# 1: Bevan 29 4 p  NA NA  NA NA 
# 2: Clarke 32 2 z  NA NA  NA NA 
# 3: Roshan NA NA NA boxing 1 england z2 
+0

'(。)' 'complete.casesで表しんどのような方法によって返信...に感謝(。)'と 'is.naは(。)' – Sharath

+0

'.'はドットです'%>%'パイプ演算子からのプレースホルダです。どこにでも右側に '.'があると、オペレータの左側が置かれます。そうすれば、右手側で何回か左手側を使用したり、右手側の最初の機能パラメータ以外の位置で使用することができます。 詳しい説明と例については、 'help("%>% "、package =" magrittr ")'をご覧ください。 –

+0

ありがとうございました.... – Sharath