使用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


以上是使用data.table将表中的列值替换为基于R中匹配项的查找值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>