【发布时间】:2017-02-03 15:14:00
【问题描述】:
两个输入数据集:
A <- data.frame(id = c(1, 2, 3), value = rep(NA, 3))
A
id value
<dbl> <lgl>
1 1 NA
2 2 NA
3 3 NA
B <- data.frame(id = c(3, 2), value = c(3, 2))
B
id value
1 3 3
2 2 2
将B中的可用值加到A中后,预计有:
A
id value
<dbl> <lgl>
1 1 NA
2 2 2
3 3 3
可以通过下面的for循环来实现。但是,for 循环通常非常慢。如何更高效?
for(i in 1:nrow(A)){
item <- A[i,]
print(item)
if(is.na(item$value) && (item$id %in% B$id)){
A[i, "value"] <- B[B$id == item$id,]$value
}
}
加入可以解决这个问题。但需要一个规则来解决冲突。
【问题讨论】:
-
@nrussell,这需要B覆盖A。它属于哪种类型的join?
-
左连接然后合并 --
left_join(A, B, by = "id") %>% mutate(value = coalesce(value.x, value.y)) %>% select(id, value). -
谢谢。这就是答案。
-
这是一个带有
match的基本R方法:A$value[A$id %in% B$id] <- B$value[match(A$id, B$id)[!is.na(match(A$id, B$id))]],适用于该示例。