首页 > 解决方案 > 在不使用 for 循环的情况下匹配 R 数据帧之间的值

问题描述

我有以下数据框:

db1 = data.frame(name = c('a', 'b', 'c', 'd'), age = c('10', '20', '30', '40'), tier = NA)
db2 = data.frame(name = c('a', 'a', 'c', 'b'), age = c('10', '10', '30', '20'), tier = c('1', '3', '4', '2'))

如果和变量匹配,我想将tier值输入db2到同一列中。db1nameage

我可以使用 for 循环来做到这一点,但是当我们处理数千行时,这需要很长时间。有没有更快的方法来做到这一点?

for (i in 1:nrow(db1)){
  for (j in 1:nrow(db2)){
    if (db1$name[i] == db2$name[j] & db1$age[i] == db2$age[j]){
      db1$tier[i] = db2$tier[j]
    }
  }
}

标签: rfor-loop

解决方案


当取第一个以防它多次匹配时也可以(您的代码取最后一个),您可以将matchand 用于带有interaction.

db1$tier <- db2$tier[match(interaction(db1[c("name","age")]),
                           interaction(db2[c("name","age")]))]
db1
#  name age tier
#1    a  10    1
#2    b  20    2
#3    c  30    4
#4    d  40 <NA>

或者使用另外的 `rev.

db1$tier <- rev(db2$tier)[match(interaction(db1[c("name","age")]),
                    rev(interaction(db2[c("name","age")])))]
db1
#  name age tier
#1    a  10    3
#2    b  20    2
#3    c  30    4
#4    d  40 <NA>

推荐阅读