Объединить (или объединить) наборы данных на основе 2 переменных во втором наборе данных - PullRequest
0 голосов
/ 19 октября 2018

Я хочу объединить / объединить два набора данных на основе 2 переменных второго набора данных.

Описанное словами, я хочу присоединиться на основе переменной 1 (VAR1), и если это приведет к объединению NA с переменной 2 (VAR2).

Вот примери мое решение этого вопроса:

df_x <- data.frame(VAR0=c("A","P","C","D","Z"), stringsAsFactors = F)

df_y <- data.frame(VAR1=c("A","B","C","D","E"),
                   VAR2=c("A","F","T","D","Z"),
                   VAR3=c("YES", "YES", "NO", "MAYBE", "YES"),
                   stringsAsFactors = F)

require(dplyr)
# LEFT JOIN TWICE TO MEET BOTH CONDITIONS
lj_1 <- left_join(df_x, df_y, by=c("VAR0" = "VAR1"))
lj_2 <- left_join(df_x, df_y, by=c("VAR0" = "VAR2"))

# THEN REPLACE NAs FROM FIRST LEFT JOIN WITH VALUE FROM SECOND LEFT JOIN
ifelse(lj_1$VAR3 %in% NA, lj_2$VAR3, lj_1$VAR3)
# [1] "YES"   NA      "NO"    "MAYBE" "YES"

Мне было интересно, есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 19 октября 2018

Мы можем сделать left_join в цикле и reduce это в один vector, применив coalesce к 'VAR3'

library(tidyverse)
map(paste0("VAR", 1:2), ~ 
  left_join(df_x, df_y, by = c("VAR0" = .x)) %>% 
       pull(VAR3)) %>% 
  reduce(coalesce)
#[1] "YES"   NA      "NO"    "MAYBE" "YES" 

или используя base R

pmin(df_y$VAR3[match(df_x$VAR0, df_y$VAR1)], 
             df_y$VAR3[match(df_x$VAR0, df_y$VAR2)], na.rm = TRUE)
#[1] "YES"   NA      "NO"    "MAYBE" "YES"

Или, чтобы избежать использования вызовов df, используйте with

with(df_y, with(df_x, pmin(VAR3[match(VAR0, VAR1)], 
          VAR3[match(VAR0, VAR2)], na.rm = TRUE)))   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...