Заполните значения NA в R данными из другого фрейма данных

У меня есть 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))

Прочтите Как создать минимальный, полный и проверяемый пример и соответствующим образом отредактируйте свой вопрос. Не размещайте коды, данные или сообщения об ошибках в виде изображений, размещайте текст прямо здесь, на SO.

Mr. T 24.11.2018 22:42

Пожалуйста, не публикуйте изображения данных: они не могут копироваться / вставляться нами, они маскируют истинный характер данных, программы чтения с экрана ничего с ними не делают, а некоторым мобильным устройствам трудно работать с изображениями большего размера. Чтобы сделать этот вопрос воспроизводимым, можете ли вы заменить изображения на вывод dput(x), где x является репрезентативной выборкой данных? Это может быть что-то вроде dput(head(GDP[1:5])), если этих строк / столбцов достаточно для адекватного представления данных. (То же самое для других кадров.)

r2evans 24.11.2018 22:44

Проще всего было бы использовать left_join() из dplyr, создав новую переменную, а не пытаться заполнить NA. Код будет чем-то вроде newdf <- dfA %>% left_join(dfB, by = "Country").

Joe 24.11.2018 23:09

Думаю, я правильно отформатировал пост. Я не уверен, как создавать красивые таблицы, которые я вижу в других сообщениях, но вывод кода выше демонстрирует мою проблему.

Ray B 24.11.2018 23:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
1 657
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Сначала я делаю поисковую таблицу из 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, но их можно легко отбросить, и, скорее всего, я сделал что-то не так. Но это было именно то, что мне нужно.

Ray B 26.11.2018 06:57

Другие вопросы по теме