用其他数据框中的数据填充R中的NA值

时间:2018-11-24 21:39:11

标签: r dplyr

我有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 :(得分:1)

可能有一种更简洁的方式编写此代码,但是它应该很快执行,因为它主要依赖于两个联接。

首先,我从df2中创建一个查找表,我假设每个z的值都有一个x值。查找表只需要这两列。

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

然后我进行两次联接,首先使用df1lookupz联接以获得一致的x,然后使用干净的x集,y,Codedf2结合使用,以获得相应的zGDP值。

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