У меня есть 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))
Пожалуйста, не публикуйте изображения данных: они не могут копироваться / вставляться нами, они маскируют истинный характер данных, программы чтения с экрана ничего с ними не делают, а некоторым мобильным устройствам трудно работать с изображениями большего размера. Чтобы сделать этот вопрос воспроизводимым, можете ли вы заменить изображения на вывод dput(x), где x является репрезентативной выборкой данных? Это может быть что-то вроде dput(head(GDP[1:5])), если этих строк / столбцов достаточно для адекватного представления данных. (То же самое для других кадров.)
Проще всего было бы использовать left_join() из dplyr, создав новую переменную, а не пытаться заполнить NA. Код будет чем-то вроде newdf <- dfA %>% left_join(dfB, by = "Country").
Думаю, я правильно отформатировал пост. Я не уверен, как создавать красивые таблицы, которые я вижу в других сообщениях, но вывод кода выше демонстрирует мою проблему.





Вероятно, есть более лаконичный способ написать это, но он должен выполняться довольно быстро, поскольку в основном он полагается на два соединения.
Сначала я делаю поисковую таблицу из 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
Большое спасибо! По какой-то причине он создал 4 дубликата всех наблюдений, для которых он заполнил z, но их можно легко отбросить, и, скорее всего, я сделал что-то не так. Но это было именно то, что мне нужно.
Прочтите Как создать минимальный, полный и проверяемый пример и соответствующим образом отредактируйте свой вопрос. Не размещайте коды, данные или сообщения об ошибках в виде изображений, размещайте текст прямо здесь, на SO.