【问题标题】:Filling table column by matching several rows from different tables with data.table通过将不同表中的几行与 data.table 匹配来填充表列
【发布时间】:2018-01-11 21:00:48
【问题描述】:

我需要帮助来解决以下问题:

这是一个示例数据集:

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])]
}

有几个限制:

  1. table1 不包含 table2 中的所有坐标,反之亦然。每个坐标/时间组合只有一个对应的值,因此每个坐标/时间有多个值没有问题。

  2. 我不能手动操作,因为“table1”实际上有 2*10^7 行,我想从几乎 100'000 个“table2”中获取值,每个“table2”的大小约为10000 行,每行来自不同的文件。

我尝试过合并,但是当它循环时,它会在每次迭代时添加一个新的“值”列(除此之外,它需要很长时间)。我也试过匹配

table1[time == table2$time[1] & paste0(x,y) %in% paste0(table2$x,table2$y), "values" := .(table2$values)] 

但是我不确定是否将正确的值分配给正确的坐标。

我希望我的问题很清楚,如果没有,对不起!非常感谢您的帮助。

【问题讨论】:

标签: r loops vector data.table matching


【解决方案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

【讨论】:

  • 只有一件事:一旦通过循环,值就不会更新;所以我通过上面给出的链接发现必须用 value := i.value 更新
【解决方案2】:

如果你准备好使用 dplyr 包,你可以这样做。

library(dplyr)
table3 = table1 %>% left_join(table2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多