使用R data.tables,如何在不使用合并的情况下使用另一个表更新一个表?

时间:2017-12-14 23:30:29

标签: r data.table

我在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]

1 个答案:

答案 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识别为数字类型。