r - 有条件地减去两个数据表

thi*_*oso 2 r subtraction conditional-statements data.table

我有两个data.tables显示多个位置的温度(由地理编码标识).

我想基于它们的减法创建第三个.他们来了:

library(data.table)

# Generate random data:
geocode <- paste0("N", 1:10)
dates <- seq(as.Date("2000-01-01"), as.Date("2004-12-31"), by="month")
models <- c("A", "B", "C", "D", "E")
temp <- runif(length(geocode)*length(dates)*length(models), min=0, max=30)
dt1 <- data.table(expand.grid(Location=geocode,Date=dates,Model=models),Temperature=temp)


ref <- runif(length(geocode), min=0, max=30)
dt2 <- data.table(expand.grid(Location=geocode), Temperature=ref)
Run Code Online (Sandbox Code Playgroud)

我想从dt1中有条件地减去dt2.通过每个位置(地理编码),我想从dt1中的温度中减去dt2中的温度,保留其他列(DateModel).

怎么做到这一点?我知道如果它是一个单一的数据表怎么做,但我从来没有试过在这样的两个不同的数据表上做代数.

Fra*_*ank 5

我认为这有效:

dt1[dt2, on=.(Location), td := x.Temperature - i.Temperature, by=.EACHI]

      Location       Date Model Temperature          td
   1:       N1 2000-01-01     A    3.949276 -19.2110455
   2:       N2 2000-01-01     A    2.811684 -11.6405195
   3:       N3 2000-01-01     A   24.069659  13.6159779
   4:       N4 2000-01-01     A   25.809426  -1.8793405
   5:       N5 2000-01-01     A   25.193624  19.6812965
  ---                                                  
2996:       N6 2004-12-01     E   24.298463   4.0218859
2997:       N7 2004-12-01     E    1.488011 -26.4472283
2998:       N8 2004-12-01     E   27.489108   5.6525076
2999:       N9 2004-12-01     E    3.487664  -5.9926003
3000:      N10 2004-12-01     E    8.523718  -0.7559126
Run Code Online (Sandbox Code Playgroud)

通过眼睛检查......

dt2[dt1[1:5], on=.(Location), .(Location, t1 = i.Temperature, t2 = x.Temperature)]

   Location        t1        t2
1:       N1  3.949276 23.160321
2:       N2  2.811684 14.452204
3:       N3 24.069659 10.453681
4:       N4 25.809426 27.688766
5:       N5 25.193624  5.512328
Run Code Online (Sandbox Code Playgroud)

看起来对我来说.


这个怎么运作

更新连接的语法是x[i, v := expr, by=.EACHI].表达内,前缀i.*x.*可用于阐明,其中正从采取列.

by=.EACHI可能并不需要,但我通常使用它的这一点.