簡體   English   中英

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM