构造数据:

a <- data.frame(ID = c("10001", "10002", "10003", "10004", "10005", "10006", "10007"  ,"10008" ),                   
                balance = c(100, 103, 200, 300, 809, 590, 454, 683))
print(a)
##      ID balance
## 1 10001     100
## 2 10002     103
## 3 10003     200
## 4 10004     300
## 5 10005     809
## 6 10006     590
## 7 10007     454
## 8 10008     683

构造字典:

d <- data.frame(ID = c("10003","10002","10001","10004","10006","10009"),
                gender = c("M","F","F","F","M","F"))
print(d) 
##      ID gender
## 1 10003      M
## 2 10002      F
## 3 10001      F
## 4 10004      F
## 5 10006      M
## 6 10009      F

注意:a中没有账号为10009的数据,d中没有账号为10005,10006,10007的数据。

index <- match(a$ID, d$ID)  #  生成索引,标识a中的ID在字典d中的位置
result <- cbind(a, d[index,-1])
names(result) <- c("ID", "balance", "gender")
print(result) 
##      ID balance gender
## 1 10001     100      F
## 2 10002     103      F
## 3 10003     200      M
## 4 10004     300      F
## 5 10005     809   <NA>
## 6 10006     590      M
## 7 10007     454   <NA>
## 8 10008     683   <NA>

另一种实现方法,使用merge():

result_merge <- merge(a, d, by.x = "ID", by.y="ID", all.x = TRUE)
print(result_merge)
##      ID balance gender
## 1 10001     100      F
## 2 10002     103      F
## 3 10003     200      M
## 4 10004     300      F
## 5 10005     809   <NA>
## 6 10006     590      M
## 7 10007     454   <NA>
## 8 10008     683   <NA>
identical(result, result_merge)  # 两者结果相同
## [1] TRUE

两种方式略有区别,当匹配的字段不是主键时,merge可能会返回不正确的结果。