Как объединить две переменные из разных фреймов данных в R? - PullRequest
1 голос
/ 05 ноября 2019

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

Итак, я пытаюсь импортировать новые данные, которые я получил, в мой старый data.frame. Проблема заключается в том, что эти данные должны заменить предыдущие значения NA в уже существующих переменных. Кроме того, мои данные имеют разных людей (компаний) в разные периоды (годы), и мой новый набор данных содержит только компании и годы, которые отсутствовали, плюс некоторые наблюдения, которые у меня уже были.

Я попытался смоделироватьпроблема с фреймами данных ниже:

фрейм данных с NA:

df1 <- data.frame( company = c(rep("A",3), rep("B",3), rep("C",3)),
                   year = c(rep(2016:2018,each=1)), 
                   income = c(95,87,93,NA,NA,58,102,80,NA),
                   debt = c(43,50,51,NA,37,37,53,NA,NA),
                   stringsAsFactors= F )

Для поиска новых данных я создал набор данных только с отсутствующими данными, так как мои данные имели многоНаблюдения:

df_NA <- data.frame(df1[is.na(df1$income & df1$debt),])

Итак, после поиска я смог найти недостающие данные, и теперь у меня есть что-то вроде этого:

df2 <- data.frame( company = c("A", "B" , "C" , "C"),
                   year = c(2018, 2016, 2017, 2018),
                   income = c(60,55, 80, 82),
                   debt = c(32,37, 53,48),
                   stringsAsFactors= F )

Теперь я пытаюсь получить этоданные вместе, поэтому у меня есть полный data.frame для работы.

Проблема в том, что я пока не могу найти способ сделать это. Я пробовал объединять и объединять, индексируя для компании и года, но переменные с одинаковыми именами в data.frame дублируются и имеют суффикс.

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

Извините, если на этот вопрос уже был дан ответ. Спасибо!

1 Ответ

0 голосов
/ 05 ноября 2019

Вот вариант с использованием data.table:

library(data.table)
setDT(df1)
setDT(df2)
df1[df2, on=c("company", "year"), c('income', 'debt') := { list(i.income, i.debt)}]


#   company year income debt
#1:       A 2016     95   43
#2:       A 2017     87   50
#3:       A 2018     60   32
#4:       B 2016     55   37
#5:       B 2017     NA   37
#6:       B 2018     58   37
#7:       C 2016    102   53
#8:       C 2017     80   53
#9:       C 2018     82   48

Или другой вариант с использованием dplyr

library(dplyr)
full_join(df1, df2, by = c("year", "company")) %>% 
  mutate(
    income = coalesce(income.x, income.y),
    debt= coalesce(debt.x, debt.y), 
  ) %>% 
  select(company, year, income, debt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...