如何通过匹配R中的其他两个列将一列中的值提取到数据框中

时间:2020-03-28 03:52:40

标签: r

我有这样一个问题: 有两个具有不同行的数据框。我想通过匹配两个数据框中的“ 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] }
    }
  }

但是我有大量数据,因此它运行缓慢。 是否有解决此问题的功能或直接方法? 非常感谢!

2 个答案:

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