![](/img/trans.png)
[英]How to assign a value to a column based on value in other column in R data frame or data table
[英]R data table: Assign a value to column based on reference column
我想使用另一個列作為參考將值分配給較大表中的列。
例如數據:
require(data.table)
dt <- data.table(N=c(1:5),GPa1=c(sample(0:5,5)),GPa2=c(sample(5:15,5)),
GPb1=c(sample(0:20,5)),GPb2=c(sample(0:10,5)),id=c("b","a","b","b","a"))
N GPa1 GPa2 GPb1 GPb2 id
1: 1 4 10 7 0 b
2: 2 5 15 19 7 a
3: 3 1 5 20 5 b
4: 4 0 13 3 4 b
5: 5 3 7 8 1 a
這個想法是獲得新列Val1
和Val2
。 任何以1結尾的GP
列都可以使用Val1
,任何以2結尾的GP
列都可以使用Val2
。 要插入該列的值由id
列(每行)確定。
這樣就可以看到Val1
,先繪制GPb1
列,然后GPa1
, GPb1
, GPb1
,最后GPa1
。
最終結果將是:
N GPa1 GPa2 GPb1 GPb2 id Val1 Val2
1: 1 4 10 7 0 b 7 0
2: 2 5 15 19 7 a 5 15
3: 3 1 5 20 5 b 20 5
4: 4 0 13 3 4 b 3 4
5: 5 3 7 8 1 a 3 7
我確實達到了答案,但是在融化后等了好幾行之后,但是我確信必須在data.table
有一種優雅的方法來做到這data.table
。 最初,我對paste0
在data.table
不起作用感到沮喪;
dt[1,paste0("GP",id,"1")]
但;
# The following gives a vector that is correct for Val1 (and works for 2)
diag(as.matrix(dt[,.SD,.SDcols=dt[,paste0("GP",id,"1")]]))
# I think the answer lies in `set`, but i've not had any luck.
for (i in 1:nrow(dt)) set(dt, i=dt[i,.SD,.SDcols=dt[,paste0("GP",id,"2")]], j=i, value=0)
這種方式的數據很難看,所以最好只使用熔解法。
dt[id == "a", c("Val1", "Val2") := .(GPa1, GPa2)]
dt[id == "b", c("Val1", "Val2") := .(GPb1, GPb2)]
# N GPa1 GPa2 GPb1 GPb2 id Val1 Val2
#1: 1 2 13 5 8 b 5 8
#2: 2 3 8 7 2 a 3 8
#3: 3 5 11 19 1 b 19 1
#4: 4 4 5 6 9 b 6 9
#5: 5 1 15 1 10 a 1 15
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.