r - 根据另一个数据框在 R 数据框中创建变量

标签 r

在浪费了将近一天的时间后,我正在寻求帮助。我有一个大数据框(bdf)和一个小数据框(sdf)。我想根据 sdf$y 的值(随着时间变量的函数而变化)将变量 z 添加到 bdf。

这是一个可重现的示例:

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 中使用以下 sdf$y 值创建变量 z:

  • 0.2 对于 bdf$tb 范围从第一个 bdf$tb 值到 sdf$ts 第一个值和第二个值之间的中间值的行。在这个简单的示例中,dbf 的第 1 行到第 3 行的情况就是 bdf$tb 时间低于“2013-05-23 12:00:00 GMT”。

  • -0.1 对于 bdf$tb 范围从 sdf$ts 第一个和第二个值之间的中间到 sdf$ts 第二个和第三个值之间的中间的行。在这个简单的示例中,dbf 的第 4 行和第 5 行的情况就是时间 bdf$tb 在“2013-05-23 12:00:00 GMT”和“2013-05-27 12:00:00 GMT”之间.

  • 对于 bdf$tb 范围从 sdf$ts 的第二个和第三个值的中间到 bdf$tb 的最后一个值的所有行,为 0.3。在这个简单的示例中,dbf 的第 1 行到第 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滚动连接的解决方案:

require(data.table)
setkey(setDT(sdf), ts)
sdf[bdf, roll = "nearest"]
#                      ts    y
#  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
  • setDT 通过引用将 data.frame 转换为 data.table。

  • setkey 按提供的列按升序对 data.table 按引用进行排序,并将这些列标记为关键列 (以便我们稍后可以加入这些关键列。

  • 在 data.table 中,当 i 是 data.table 时,x[i] 执行联接。我将向您推荐this answer如果您还不熟悉的话,请了解 data.table 连接。

  • x[i] 执行等连接。也就是说,它在 x 中为 i 中的每一行查找匹配的行索引,然后从 x 中提取这些行以返回联接结果i 中的相应行。如果 i 中的行在 x 中找不到匹配的行索引,则该行的 x 将为 NA > 默认情况下。

    但是,x[i, roll = .] 执行滚动连接。当没有匹配项时,要么向前结转最后一个观察值(roll = TRUE-Inf),要么向后结转下一个观察值(roll = Inf ),或滚动到最接近的值(roll = "nearest")。在这种情况下,您需要 roll = "nearest" IIUC。

HTH

关于r - 根据另一个数据框在 R 数据框中创建变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27757220/

相关文章:

r - 使用 regsubsets 进行 Predict()

r - 如何测试列表是否相等(无论顺序如何)?

用相同的值替换 Sprintf 中的多个变量

r - 在哪里定义与 fitdist (fitdistrplus) 或 fitdistr (MASS) 一起使用的分布函数?

r - 在存在可选参数的情况下如何处理省略号 (...)?

r - 为什么这段代码在 ggplot 中静态地获取 y 轴百分比不正确?

r - 计算相邻时间点的点间距离,找到 `n`遍历所有时间点的最短路径

r - 如何使用 R 从分层表派生父子表?

r - 使用所需名称字符串编写栅格时出现问题

r - 错误: could not find function … in R