我一直尝试使用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;列(在我的实际数据中有两个以上的列要匹配)
非常感谢!
答案 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
)