使用data.table将表中的列值替换为基于R中匹配项的查找值
我想用查找列中匹配的相应值替换表列中的值。我通过 data.table 包“通过引用分配”实现了这一点,一个接一个地取一个值(并且它的替换),但我认为我可以做一些更模块化的事情。
总之,我这样做:
# Build a table and a lookup
code<- c("ABC","EBC","ABC","EBC","OOO","PPP","ABC")
sn <- c(1:7)
old<- c("ABC","EBC")
new<- c("CBa","CBe")
lookup <- data.frame(old,new)
table <-data.frame(code,sn)
# Set data.table as TRUE for both
setDT(table)
setDT(lookup)
# Attempt reassignment
table[code %in% lookup$old, code := lookup$new[which(lookup$old==code)]]
table
..我明白了:
> table
code sn
1: CBa 1
2: CBe 2
3: <NA> 3
4: <NA> 4
5: OOO 5
6: PPP 6
7: <NA> 7
然而,我真正希望的是这样的结果:
> table
code sn
1: CBa 1
2: CBe 2
3: CBa 3
4: CBe 4
5: OOO 5
6: PPP 6
7: CBa 7
本质上:替换是基于分配了所有值(不仅仅是前两个)的查找进行的。我错过了什么?我曾尝试寻找其他解决方案,但建议似乎并不是我正在寻找的。感谢任何答案。
回答
我们可以on分别从表和查找中加入“代码”和“旧”
table[lookup, code := new, on = .(code = old)]
-输出
table
code sn
1: CBa 1
2: CBe 2
3: CBa 3
4: CBe 4
5: OOO 5
6: PPP 6
7: CBa 7