r - 有条件地减去两个数据表
r - Conditionally subtract two data tables
我有两个 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)
我想有条件地从 dt1 中减去 dt2。通过每个位置(地理编码),我想从 dt1 中的温度中减去 dt2 中的温度,保留其他列(Date
和 Model
)。
如何实现?如果它是单个数据 table,我会知道该怎么做,但我以前从未尝试过像这样对两个不同的数据 table 进行代数运算。
merge
(left_join
),然后 mutate
library(dplyr)
dt3 <- left_join(dt1, dt2, by="Location") %>%
mutate(desired=Temperature.x-Temperature.y)
输出
Location Date Model Temperature.x Temperature.y desired
1 N1 2000-01-01 A 4.158847 17.531085 -13.3722373
2 N2 2000-01-01 A 9.644764 23.184142 -13.5393783
3 N3 2000-01-01 A 4.644948 20.946587 -16.3016384
4 N4 2000-01-01 A 3.966845 25.232795 -21.2659502
5 N5 2000-01-01 A 6.639178 29.325365 -22.6861873
6 N6 2000-01-01 A 6.791424 6.957811 -0.1663875
取消选择 Temperature.x 和 Temperature.y
dt3 <- dt3 %>% select(-Temperature.x, -Temperature.y)
我认为这可行:
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
目测...
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
我觉得很合适。
工作原理
更新连接的语法是x[i, v := expr, by=.EACHI]
。在表达式内部,前缀 i.*
和 x.*
可用于阐明从何处获取列。
可能不需要by=.EACHI
,但我通常会用它。
我有两个 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)
我想有条件地从 dt1 中减去 dt2。通过每个位置(地理编码),我想从 dt1 中的温度中减去 dt2 中的温度,保留其他列(Date
和 Model
)。
如何实现?如果它是单个数据 table,我会知道该怎么做,但我以前从未尝试过像这样对两个不同的数据 table 进行代数运算。
merge
(left_join
),然后 mutate
library(dplyr)
dt3 <- left_join(dt1, dt2, by="Location") %>%
mutate(desired=Temperature.x-Temperature.y)
输出
Location Date Model Temperature.x Temperature.y desired
1 N1 2000-01-01 A 4.158847 17.531085 -13.3722373
2 N2 2000-01-01 A 9.644764 23.184142 -13.5393783
3 N3 2000-01-01 A 4.644948 20.946587 -16.3016384
4 N4 2000-01-01 A 3.966845 25.232795 -21.2659502
5 N5 2000-01-01 A 6.639178 29.325365 -22.6861873
6 N6 2000-01-01 A 6.791424 6.957811 -0.1663875
取消选择 Temperature.x 和 Temperature.y
dt3 <- dt3 %>% select(-Temperature.x, -Temperature.y)
我认为这可行:
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
目测...
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
我觉得很合适。
工作原理
更新连接的语法是x[i, v := expr, by=.EACHI]
。在表达式内部,前缀 i.*
和 x.*
可用于阐明从何处获取列。
可能不需要by=.EACHI
,但我通常会用它。