构造数据:
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可能会返回不正确的结果。