![](/img/trans.png)
[英]data.table replace data using values from another data.table, conditionally
[英]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
在cb
, var
是dt
的對應變量, val
是dt
中具有相應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.