簡體   English   中英

將data.table的值替換為另一個data.table中的值

[英]Replace values of data.table with values from another data.table

我有一個包含300列和1000行的數據集以及data.table格式的相應代碼簿。 為簡單起見,我將為兩者提供3列。

dt <- data.table(id = 1:10,
                 a  = sample(c(1,2,3),10, replace = T),
                 b  = sample(c(1,2)  ,10, replace = T),
                 c  = sample(c(1:5)  ,10, replace = T))

    id a b c
 1:  1 2 1 2
 2:  2 2 1 1
 3:  3 3 1 1
 4:  4 3 1 1
 5:  5 1 2 5
 6:  6 2 1 3
 7:  7 1 2 3
 8:  8 1 1 2
 9:  9 2 1 5
10: 10 3 2 4

cb <- data.table(var = c(rep("a", 3), rep("b", 2), rep("c", 5)),
                 val = c(1,2,3,1,2,1,2,3,4,5),
                 des = c("red", "blue", "yellow", "yes","no","K", "Na","Ag","Au","Si"))

    var val    des
 1:   a   1    red
 2:   a   2   blue
 3:   a   3 yellow
 4:   b   1    yes
 5:   b   2     no
 6:   c   1      K
 7:   c   2     Na
 8:   c   3     Ag
 9:   c   4     Au
10:   c   5     Si

cbvardt的對應變量, valdt中具有相應des值的值。 我想編輯dt通過替換值dt由值cb 應該是這樣的

    id      a   b  c
 1:  1    red yes Na
 2:  2 yellow  no Ag
 3:  3   blue yes Ag
 4:  4    red yes Au
 5:  5   blue yes Ag
 6:  6   blue  no Au
 7:  7 yellow yes Si
 8:  8   blue  no Ag
 9:  9    red  no  K
10: 10 yellow  no Ag

如何有效地執行這樣的操作,並且聽起來不像我的計算機內置活塞?

原因是我有一個預先編寫的代碼來分析數據並需要實際值才能運行它。 它也可能在一般情況下有用,因為很多時候我都會獲得數據和代碼簿,但通常它們不是這么多變量。

你可以試試

dcast(melt(dt, 1, var="var", val="val")[cb, on=c("var","val")], id~var, value.var="des")
#     id      a   b  c
#  1:  1    red yes  K
#  2:  2 yellow  no Si
#  3:  3    red yes Si
#  4:  4    red  no Au
#  5:  5    red  no Ag
#  6:  6   blue yes  K
#  7:  7   blue  no Si
#  8:  8 yellow yes Na
#  9:  9   blue yes Ag
# 10: 10 yellow yes Si

另一種選擇是進行多次合並+更新:

cb_dc <- data.table::dcast(cb, des~var, value.var = "val")
cols = c("a","b","c")
dt[, (cols) := lapply(cols, function(x) cb_dc[dt, des, on = x]) ]

 #  id      a   b  c
 #1:  1    red yes Si
 #2:  2   blue yes Na
 #3:  3   blue  no Au
 #4:  4 yellow yes  K
 #5:  5    red  no Na
 #6:  6 yellow yes Na
 #7:  7 yellow  no  K
 #8:  8   blue  no Na
 #9:  9   blue yes Si
#10: 10    red  no Na

數據:

set.seed(1)
  dt <- data.table(id = 1:10,
                   a  = sample(c(1,2,3),10, replace = T),
                   b  = sample(c(1,2)  ,10, replace = T),
                   c  = sample(c(1:5)  ,10, replace = T))

這個dplyr答案essentialy連接一個子表一次為三列中的每一列。

library(dplyr)

dt %>% 
  left_join(cb %>% filter(var == "a"), by=c("a" = "val")) %>% 
  left_join(cb %>% filter(var == "b"), by=c("b" = "val")) %>% 
  left_join(cb %>% filter(var == "c"), by=c("c" = "val")) %>%
  select(id, des.x, des.y, des) %>%
  rename(a = des.x, b = des.y, c = des)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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