替换列中与R中另一个data.frame的多个列匹配的值

时间:2018-03-08 23:33:50

标签: r dplyr

我一直尝试使用dplyr包中的合并和联合选项,但我无法获得我正在寻找的合并类型。

一个例子,考虑data.frame

df1 <- data.frame(Country=c(rep("AFG",3),rep("AUS",3)), Category=(rep(c("a","b","c"),2)), value=c(1:6), othr=c(10:15)) 

和另一个data.frame

df2 <- data.frame(Country=c(rep("AFG",2)), Category=c("a","b"), value=c(7,8))

理想的输出是这样的:

   Country Category value othr
1     AFG        a     7   10
2     AFG        b     8   11
3     AFG        c     3   12
4     AUS        a     4   13
5     AUS        b     5   14
6     AUS        c     6   15

即,df1$value在AFG-a和AFG-b中被df2$value替换。我希望将这个操作包含在循环中,根据&#34; Country&#34;进行许多更改。和&#34;类别&#34;列(在我的实际数据中有两个以上的列要匹配)

非常感谢!

1 个答案:

答案 0 :(得分:0)

使用dplyr,我们可以使用coalesce

library(dplyr)

df1 %>% 
  full_join(df2, by = c('Country', 'Category'), suffix = c('', '.1')) %>%
  mutate_if(is.numeric, as.numeric) %>%
  mutate(value = coalesce(value.1, value)) %>% 
  select(-value.1)

返回:

  Country Category value othr
1     AFG        a     7   10
2     AFG        b     8   11
3     AFG        c     3   12
4     AUS        a     4   13
5     AUS        b     5   14
6     AUS        c     6   15

使用data.table,我们可以:

library(data.table)

dt1 <- setDT(df1)
dt2 <- setDT(df2)

dt1[dt2, on = c("Country", "Category"), value := i.value]

返回:

   Country Category value othr
1:     AFG        a     7   10
2:     AFG        b     8   11
3:     AFG        c     3   12
4:     AUS        a     4   13
5:     AUS        b     5   14
6:     AUS        c     6   15

数据:

df1 <- data.frame(
  Country = c(rep("AFG", 3), rep("AUS", 3)),
  Category = (rep(c("a", "b", "c"), 2)),
  value = c(1:6),
  othr = c(10:15),
  stringsAsFactors = FALSE
)

df2 <- data.frame(
  Country = c(rep("AFG", 2)),
  Category = c("a", "b"),
  value = c(7, 8),
  stringsAsFactors = FALSE
)