![](/img/trans.png)
[英]How do I replace values in a data.table's column using a look up table? [R]
[英]Replace column values in table with values from lookup based on matches in R using data.table
我想用查找列中匹配的相應值替換表列中的值。 我通過 data.table package “通過引用賦值”實現了這一點,一個接一個地取一個值(並且它是替換),但我認為我可以做一些更模塊化的事情。
總之,我這樣做:
# 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
一個基本的 R 選項可以工作(但強烈推薦@akrun 的data.table
解決方案,超級優雅!)
transform(
table,
code = replace(
code,
code %in% lookup$old,
setNames(lookup$new, lookup$old)[code][code %in% lookup$old]
)
)
這使
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
選項
> lookup[table, on = .(old = code)][, new := fcoalesce(new, old)][, old := NULL][]
new sn
1: CBa 1
2: CBe 2
3: CBa 3
4: CBe 4
5: OOO 5
6: PPP 6
7: CBa 7
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.