我在R
中有两个数据帧df1
key volume name hours location
ABC 456 SS32 34.34 London
ERT 34 SS31 33.14 London
TYU 21 SS33 3 London
GHU 678 SS35 1.30 London
THU 67 SS35 0.30 London
df2
key volume hours
ABC 345 37.34
ERT 54 31.14
TYU 12 6.23
GHU 679 0.50
现在,我想合并这两个数据框,将volume and hours
中的df1
列替换为df2
中的列
如果key
列上没有匹配项,请保留df1
我想要的数据框是
df1
key volume name hours location
ABC 345 SS32 37.34 London
ERT 54 SS31 31.14 London
TYU 12 SS33 6.23 London
GHU 679 SS35 0.50 London
THU 67 SS35 0.30 London
当我进行左连接时,会创建一个volume.1
和hours.1
作为两个新变量
答案 0 :(得分:1)
我认为有两种方法可以解决这个问题:
加入然后覆盖
我可以通过加入然后使用df1
中的值覆盖df2
来获得结果。但是这个解决方案感觉非常笨重。
library(dplyr)
left_join(df1, df2, by = "key", suffix = c("", ".2")) %>%
mutate(volume = if_else(is.na(volume.2), volume, volume.2),
hours = if_else(is.na(hours.2), hours, hours.2)) %>%
select(-volume.2, -hours.2)
#> key volume name hours location
#> 1 ABC 345 SS32 37.34 London
#> 2 ERT 54 SS31 31.14 London
#> 3 TYU 12 SS33 6.23 London
#> 4 GHU 679 SS35 0.50 London
#> 5 THU 67 SS35 0.30 London
绑定行
替代方法可以是bind_rows
而是保留first
的{{1}}值以及名称和位置以及df1
的值和小时值,它们将等于来自last
(如果有)。这感觉"整洁"对我来说,不是加入和覆盖。
df2
答案 1 :(得分:0)
这是一个解决方案:
df3 <- inner_join(df1[c("key", "name", "location")], df2, by = "key") %>%
bind_rows(anti_join(df1, df2, by = "key") ) %>%
select(key, volume, name, hours, location)