r - 在不使用 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
到同一列中。db1
name
age
我可以使用 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]
}
}
}
解决方案
当取第一个以防它多次匹配时也可以(您的代码取最后一个),您可以将match
and 用于带有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>
推荐阅读
- daru - 如何反转 Daru::DataFrame 的行?
- android - 未获取具有自定义文档 ID 的 Firestore 文档
- javascript - 如何为正文设置背景?
- java - DateTimeFormatter 中的格式化程序,用于时间的 ISO 8601 日期格式
- java - 在 Vaadin 中显示电子表格组件
- angular - 如何从 Angular 将图像作为 blob 发送?
- wpf - 如何减少样式中的重复 - 带触发器的控件模板 (xaml)
- c# - iTextSharp 5:如何对齐页脚右侧的页码“x/x”
- javascript - 框未在画布 Javascript 上显示
- android - MediaPlayer 无法在 OnePlus 上运行 - 为什么?