2017-11-07 6 views
0

私はfull_joinを実行したい4つのデータセットを持っています。簡潔にするため、ここではdf1df2という2つのデータセットを使用します。rでデータをマージするとき、レコードIDが1つのデータセットに含まれているかどうかを確認するにはどうすればよいでしょうか?

df1 <- data.frame(ID = c(1, 3, 4, 5), V1 = LETTERS[11:14], V2 = letters[17:20]) 
df2 <- data.frame(ID = c(1, 10, 4, 9, 13), X5 = paste0(LETTERS[14:17], 1:5), X16 = paste0(letters[17:20], 1:5, 6:10), X23 = 56:60) 

レコードが1つのデータセットに表示されているかどうかを知りたいのですが、その逆の場合もあります。結合を実行する前に、各データセットに列(インジケータ)を含めました。

df1 <- df1 %>% mutate(in_df1 = 1) # 1 if record is inside df1 
df2 <- df2 %>% mutate(in_df2 = 1) # 1 if record is inside df2 

その後、私が参加し、完全なを実行し、私は次のようにこの作品0

df <- full_join(df1, df2, by = "ID") %>% 
    mutate_at(vars(in_df1, in_df2), funs(coalesce(., 0))) %>% 
    select(ID, V1, V2, X5, X16, X23, in_df1, in_df2) 

in_df1in_df2列にNASに置き換えます

# df 
# ID V1 V2 X5 X16 X23 in_df1 in_df2 
# 1 1 K q N1 q16 56  1  1 
# 2 3 L r <NA> <NA> NA  1  0 
# 3 4 M s P3 s38 58  1  1 
# 4 5 N t <NA> <NA> NA  1  0 
# 5 10 <NA> <NA> O2 r27 57  0  1 
# 6 9 <NA> <NA> Q4 t49 59  0  1 
# 7 13 <NA> <NA> N5 q510 60  0  1 

しかし、私は希望これを行うより良い方法を知るために。

+2

'マージ(data.frame(DF1、DF1 = 1)、data.frame(DF2、DF2 = 1)、すべて= TRUE)' –

+1

はまた、対象質問、 'setdiff(DF1の$に答えますID、df2 $ ID) ' – G5W

+1

キーが設定されていない場合、' merge'の 'by'パラメータを指定する必要があります。この例では、 'merge(df1、df2、by =" ID "、all = T)' – Gautam

答えて

0

私はそれがいいのか分かりませんが、少なくともRベースでそれを行う方法です。

df <- merge(df1, df2, all = TRUE) 
df$InDf1 <- ifelse(is.na(match(df$ID, df1$ID)),0,1) 
df$InDf2 <- ifelse(is.na(match(df$ID, df$ID)),0,1) 

> df 
    ID V1 V2 X5 X16 X23 InDf1 InDf2 
1 1 K q N1 q16 56  1  1 
2 3 L r <NA> <NA> NA  1  0 
3 4 M s P3 s38 58  1  1 
4 5 N t <NA> <NA> NA  1  0 
5 9 <NA> <NA> Q4 t49 59  0  1 
6 10 <NA> <NA> O2 r27 57  0  1 
7 13 <NA> <NA> N5 q510 60  0  1 
関連する問題