我有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))
答案 0 :(得分: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