Заполнить значения NA в R данными из другого фрейма данных - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть 2 фрейма данных с некоторыми одинаковыми и уникальными столбцами.Первый кадр данных имеет некоторые значения NA в одинаковых столбцах.Я хотел бы заменить их данными из второго фрейма данных и объединить все столбцы в 1 фрейм данных.В конечном счете, решение должно быть сделано с очень большими кадрами данных, поэтому эффективность является идеальной.

Исходные кадры данных:

df1 = data.frame(x = c("Canada", "Canada", NA, NA), 
            y = c(2010, 2010, 2011, 2011), 
            z = c(NA, NA, "CAN", "CAN"),
            Code = c(2, 6, 2, 6))

df2 = data.frame(x = c("Canada", "Canada", "Canada", "Canada"), 
             y = c(2013, 2012, 2011, 2010), 
             z = c("CAN", "CAN", "CAN", "CAN"), 
             GDP = c(22, 20, 18, 16))

Ожидаемый результат:

df3 = data.frame(x = c("Canada", "Canada", "Canada", "Canada"), 
             y = c(2010, 2010, 2011, 2011), 
             z = c("CAN", "CAN", "CAN", "CAN"),
             Code = c(2, 6, 2, 6), 
             GDP = c(16, 16, 18, 18))

1 Ответ

0 голосов
/ 25 ноября 2018

Вероятно, есть более краткий способ написать это, но он должен выполняться довольно быстро, так как он опирается в основном на два соединения.

Сначала я создаю справочную таблицу из df2, которая, как я предполагаю, имеет единственное значение z для каждого значения x.Таблице поиска нужны только эти два столбца.

library(dplyr)
lookup <- df2 %>% distinct(x, z)

Затем я делаю два соединения, сначала объединяя df1 с lookup, используя z, чтобы получить согласованный x, а затем используя чистуюнабор x, y, и Code для объединения с df2 для получения соответствующих значений z и GDP.

df1 %>%
  left_join(lookup, by = "z") %>%
  mutate(x = if_else(is.na(x.x), x.y, x.x)) %>%
  select(x, y, Code) %>%
  left_join(df2, by = c("x", "y")) %>%
  select(x, y, z, Code, GDP)  # Optional, just to resort columns

#       x    y   z Code GDP
#1 Canada 2010 CAN    2  16
#2 Canada 2010 CAN    6  16
#3 Canada 2011 CAN    2  18
#4 Canada 2011 CAN    6  18
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...