我在浪费了将近一天的时间后寻求帮助。我有一个大数据框(bdf)和一个小数据框(sdf)。我想根据 sdf$y 的值(它随着时间变量而变化)向 bdf 添加变量 z。
这里是一个可复制的示例:
bdf <- data.frame(tb = seq(as.POSIXct("2013-05-19 17:11:22 GMT", tz="GMT"), by=5624*24, length.out=10))
bdf
tb
1 2013-05-19 17:11:22
2 2013-05-21 06:40:58
3 2013-05-22 20:10:34
4 2013-05-24 09:40:10
5 2013-05-25 23:09:46
6 2013-05-27 12:39:22
7 2013-05-29 02:08:58
8 2013-05-30 15:38:34
9 2013-06-01 05:08:10
10 2013-06-02 18:37:46
sdf <- data.frame(ts = as.POSIXct(c("2013-05-22", "2013-05-25", "2013-05-30"), tz="GMT"), y = c(0.2, -0.1, 0.3))
> sdf
ts y
1 2013-05-22 0.2
2 2013-05-25 -0.1
3 2013-05-30 0.3
我想在bdf中创建变量z,其值如下所示:
对于bdf$tb范围介于sdf$ts的第一个值和第二个值之间的行,将z设为0.2。在这个简单的例子中,即dbf的前3行具有小于“2013-05-23 12:00:00 GMT”的时间戳。
对于bdf$tb范围介于sdf$ts的第二个值和第三个值之间的行,将z设为-0.1。在这个简单的例子中,即dbf的第4和第5行具有时间戳介于“2013-05-23 12:00:00 GMT”和“2013-05-27 12:00:00 GMT”之间。
对于所有bdf$tb范围介于sdf$ts的第三个值和最后一个值之间的行,将z设为0.3。在这个简单的例子中,即dbf的第6到10行具有时间戳大于“2013-05-23 12:00:00 GMT”。
因此,最终,大型数据框bdf应该如下所示:
tb z
1 2013-05-19 17:11:22 0.2
2 2013-05-21 06:40:58 0.2
3 2013-05-22 20:10:34 0.2
4 2013-05-24 09:40:10 -0.1
5 2013-05-25 23:09:46 -0.1
6 2013-05-27 12:39:22 0.3
7 2013-05-29 02:08:58 0.3
8 2013-05-30 15:38:34 0.3
9 2013-06-01 05:08:10 0.3
10 2013-06-02 18:37:46 0.3
我尝试使用dplyr::mutate,但没有成功,使用循环也没有进展...非常感谢任何帮助。我希望我清楚地描述了问题,并遵守了礼仪(这是我的第一个问题)。
data.table
包中可能使用roll = "nearest"
,但我对它没有经验,我很好奇在dplyr
中是否也有类似的功能。 - ckluss