我收到的脚本实际上是根据时间戳将两个数据源连接在一起。运行需要很长时间。所以我想改写它。让我简要解释一下这个问题:
数据
来自两个不同来源的数据。我们称之为 A 和 B ,以简化操作。 来源A 记录,例如环境中二氧化碳浓度每秒两次。 来源B 包含在机器人挤奶期间对个别奶牛的观察。因此,机器人记录牛奶产量,例如,从开始到挤奶结束(表中的一行)。
我很快写了一个简单的数据表示形式:
ori = "2015-03-02"
TimeStamp <- seq(from=20000,to=20025, by = 0.5)
TimeStamp <- as.POSIXct(TimeStamp[-length(TimeStamp)], origin = ori, tz ="GMT")
set.seed(42)
x1 <- 1000:2000
x1 <- sample(50)
sourceA <- data.frame(TimeStamp = TimeStamp, x1 = x1)
StartTime <- seq(from=20000,to=20025, by = 5)
EndTime <- StartTime + 2
StartTime <- as.POSIXct(StartTime[-length(StartTime)], origin = ori, tz ="GMT")
EndTime <- as.POSIXct(EndTime[-length(EndTime)], origin = ori, tz ="GMT")
set.seed(36)
x2 <- 600:800
x2 <- sample(x2,size = 5)
sourceB <- data.frame(StartTime = StartTime, EndTime = EndTime, x2 = x2)
最初,我编写了一个脚本来计算TimeStamp和StartTime之间的时差。然后,如果差异为0,则将来自源 B 的数据附加到源 A 。我希望避免逐个循环遍历数据 - 这将永远需要。
什么是接近这个的好方法?
[编辑]
我添加了代码来创建所需的输出:
tmp <- NULL
for(i in 1:5){
tmp <- c(tmp, rep(sourceB$x2[i],6))
tmp <- c(tmp, rep(0,4))
}
EndResult <- data.frame(TimeStamp = sourceA$TimeStamp, x1 = sourceA$x1, x2 = tmp)
答案 0 :(得分:3)
我将假设我们在这里处理真正的POSIXct
类(而不是因为你假设偶然产生的因素),然后解决方案就是使用foverlaps
中的data.table
函数这个任务非常有效。
首先,我们将两个数据集转换为data.table
个对象,在两个对象中创建相应的开始和结束日期,然后键入较小的数据集。然后,剩下要做的就是运行foverlaps
函数。以下是前10行的结果
library(data.table)
setkey(setDT(sourceB), StartTime, EndTime)
setnames(setDT(sourceA)[, EndTime := TimeStamp], "TimeStamp", "StartTime")
(EndResult <- foverlaps(sourceA, sourceB))
# StartTime EndTime x2 i.StartTime x1 i.EndTime
# 1: 2015-03-02 05:33:20 2015-03-02 05:33:22 725 2015-03-02 05:33:20 1 2015-03-02 05:33:20
# 2: 2015-03-02 05:33:20 2015-03-02 05:33:22 725 2015-03-02 05:33:20 47 2015-03-02 05:33:20
# 3: 2015-03-02 05:33:20 2015-03-02 05:33:22 725 2015-03-02 05:33:21 21 2015-03-02 05:33:21
# 4: 2015-03-02 05:33:20 2015-03-02 05:33:22 725 2015-03-02 05:33:21 5 2015-03-02 05:33:21
# 5: 2015-03-02 05:33:20 2015-03-02 05:33:22 725 2015-03-02 05:33:22 17 2015-03-02 05:33:22
# 6: <NA> <NA> NA 2015-03-02 05:33:22 13 2015-03-02 05:33:22
# 7: <NA> <NA> NA 2015-03-02 05:33:23 27 2015-03-02 05:33:23
# 8: <NA> <NA> NA 2015-03-02 05:33:23 23 2015-03-02 05:33:23
# 9: <NA> <NA> NA 2015-03-02 05:33:24 3 2015-03-02 05:33:24
# 10: <NA> <NA> NA 2015-03-02 05:33:24 4 2015-03-02 05:33:24
....