首页 > 解决方案 > 如何在R中组合来自不同数据帧的两个变量?

问题描述

我是 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 中具有相同名称的变量会被重复和后缀。

在我的数据中,我有更多的观察和变量要填充,所以我想找到一种可以通过命令完成的方法。这也将在未来再次发生,所以这将非常有帮助。

如果这已经被回答,我很抱歉。谢谢!

标签: rdataframejoinmerge

解决方案


这是使用的选项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)

推荐阅读