如何合并两个数据帧并将具有相同名称的列替换为R中的其他列

时间:2017-10-26 18:00:03

标签: r

我在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.1hours.1作为两个新变量

2 个答案:

答案 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)