2017-11-07 13 views
0

full_join을 수행하고 싶은 4 가지 데이터 세트가 있습니다. 간결함을 위해 df1df2이라는 두 개의 데이터 세트를 사용합니다.r에 데이터를 병합 할 때 레코드 ID가 하나의 데이터 세트에 있지만 다른 레코드 세트에 없는지 확인하려면 어떻게해야합니까?

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) 

레코드가 하나의 데이터 집합에 나타나지만 다른 데이터 집합에는 나타나지 않는지, 그 반대인지 알고 싶습니다. 조인을 수행하기 전에 각 데이터 세트에 열 (표시기)을 포함 시켰습니다. 그런 다음

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 열에서의 NA를 대체 수행

# 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