我需要帮助找到解决以下问题的方法:
以下是一个示例数据集:
library(data.table)
x_coord <- rep(sort(rep(c(1:3),3)),2)
y_coord <- rep(c(1:3),6)
time_info <- c(rep(strptime("201701010000", tz = "UTC", format = "%Y%m%d%H%M"),9), rep(strptime("201701010005", tz = "UTC", format = "%Y%m%d%H%M"),9))
table1 <- data.table(x = x_coord, y = y_coord, time = time_info)
table2 <- data.table(x = c(1,1,3,2), y = c(1,1,3,1),time = rep(time_info[1], 4), values = c(3,5,8,6))
# table2 has one unique time-value
目的是使用table2中的值填充table1,使其如下所示:
table3 <- table1
for (i in c(1:nrow(table2))) {
table3[x == table2$x[i] & y == table2$y[i] & time == table2$time[i],"values" := .(table2$values[i])]
}
有几个限制因素:
table1不包含table2和反向的所有坐标。每个坐标/时间组合只有一个对应的值,因此每个坐标/时间没有多个值的问题。
我无法手动完成,因为“table1”实际上有2 * 10 ^ 7行,我想从几乎100'000“table2”中获取每个大小约为1的值10000行,每行来自不同的文件。
我尝试过合并,但是当它循环时,它会在每次迭代时添加一个新的“值”列(最重要的是它需要很长时间)。我也试过与
匹配table1[time == table2$time[1] & paste0(x,y) %in% paste0(table2$x,table2$y), "values" := .(table2$values)]
但是我不确定是否将正确的值分配给了正确的坐标。
我希望我的问题很清楚,如果没有,请对不起!非常感谢您的帮助。
答案 0 :(得分:1)
与data.table
的加入:
table1[table2, on = .(x, y, time), values := values][]
给出:
x y time values 1: 1 1 2017-01-01 01:00:00 5 2: 1 2 2017-01-01 01:00:00 NA 3: 1 3 2017-01-01 01:00:00 NA 4: 2 1 2017-01-01 01:00:00 6 5: 2 2 2017-01-01 01:00:00 NA 6: 2 3 2017-01-01 01:00:00 NA 7: 3 1 2017-01-01 01:00:00 NA 8: 3 2 2017-01-01 01:00:00 NA 9: 3 3 2017-01-01 01:00:00 8 10: 1 1 2017-01-01 01:05:00 NA 11: 1 2 2017-01-01 01:05:00 NA 12: 1 3 2017-01-01 01:05:00 NA 13: 2 1 2017-01-01 01:05:00 NA 14: 2 2 2017-01-01 01:05:00 NA 15: 2 3 2017-01-01 01:05:00 NA 16: 3 1 2017-01-01 01:05:00 NA 17: 3 2 2017-01-01 01:05:00 NA 18: 3 3 2017-01-01 01:05:00 NA
答案 1 :(得分:0)
如果你准备使用dplyr软件包,你可以这样做。
library(dplyr)
table3 = table1 %>% left_join(table2)