我在R中有以下数据表:
Dt:
id date value
1 2017/1/1 1
1 2017/1/2 6
...
2 2017/1/1 5
...
Mult:
id mult
1 .5
2 4
...
我希望将Dt中的每个值乘以Mult中相应的乘数,基于id。显然,我可以这样做:
Dt = merge(Dt,Mult,by='id')
Dt[,value := value * mult]
然而,这会为Dt的每一行添加一个乘数字段,这似乎是对时间和空间的巨大浪费。有没有办法可以做类似的事情:
Dt[,value := value * Mult[id==Dt$id]$mult]
答案 0 :(得分:3)
这可以通过更新加入来解决:
Dt[, value := as.numeric(value)][Mult, on = "id", value := value * mult][]
id date value 1: 1 2017/1/1 0.5 2: 1 2017/1/2 3.0 3: 2 2017/1/1 20.0
请注意,[, value := as.numeric(value)]
是必需的,以确保我们获得正确的结果,因为value
的类型为整数,mult
的类型为数字。因此,value * mult
的结果是数字类型,但会在整数列中分段存储。
如果创建了新列,则没有问题:
Dt[Mult, on = "id", new_value := value * mult][]
id date value new_value 1: 1 2017/1/1 1 0.5 2: 1 2017/1/2 6 3.0 3: 2 2017/1/1 5 20.0
Dt <- fread(
"id date value
1 2017/1/1 1
1 2017/1/2 6
2 2017/1/1 5"
)
请注意,fread()
已将value
识别为整数类型。
Mult <- fread(
"id mult
1 .5
2 4"
)
请注意,fread()
已将mult
识别为数字类型。