我有这样一个问题: 有两个具有不同行的数据框。我想通过匹配两个数据框中的“ aa”字段来将dfb中的“ bb”中的值提取到dfa中的“ bb”中。
dfa <- data.frame(cbind(c(1,2,3,4,5), c(0,0,0,0,0)))
colnames(dfa) <- c("aa", "bb")
dfb <- data.frame(cbind(c(3,5,1), c(8,6,10)))
colnames(dfb) <- c("aa", "bb")
dfa的结果应如下所示:
aa bb
1 10
2 0
3 8
4 0
5 6
目前,我使用循环来解决此问题:
for (i in 1:nrow(dfa)) {
for (j in 1:nrow(dfb)) {
if(dfa$aa[i] == dfb$aa[j] ) {
dfa$bb[i] <- dfb$bb[j] }
}
}
但是我有大量数据,因此它运行缓慢。 是否有解决此问题的功能或直接方法? 非常感谢!
答案 0 :(得分:2)
如果使用dplyr,这非常简单(首先连接2个数据框,然后根据bb.x中的NA值从bb.x和bb.y列中选择正确的值。最后仅保留所需的列。
dfa %>%
dplyr::left_join(dfb, by = "aa") %>%
dplyr::mutate(bb = ifelse(is.na(bb.y), bb.x, bb.y)) %>%
dplyr::select(aa, bb)
结果
aa bb
1 1 10
2 2 0
3 3 8
4 4 0
5 5 6
答案 1 :(得分:0)
我们可以使用match
:
dfa$bb[match(dfb$aa, dfa$aa)] <- dfb$bb
#In this case this will also work
#dfa$bb[dfb$aa] <- dfb$bb
dfa
# aa bb
#1 1 10
#2 2 0
#3 3 8
#4 4 0
#5 5 6
如果dfb
中的值不在dfa
中,我们可以用其他方法做同样的事情
dfa$bb <- dfb$bb[match(dfa$aa, dfb$aa)]
如果我们需要将NA
替换为0,我们可以这样做:
dfa$bb[is.na(dfa$bb)] <- 0
这类似于使用merge
merge(dfa, dfb, all.x = TRUE, by = 'aa')[-2]