r - 根据另一个数据框中的日期范围划分数据框中的值

标签 r date dataframe lubridate

我有两个数据框。数据帧 data 一有两列:一列包含 ymd 日期,其他值:

        date value
1 2009-10-23  1100
2 2009-05-01  5000
3 2010-01-13  3050
4 2010-07-24  2700
5 2009-06-16  2600

我的第二个数据框(名为factors)也有两列:另一个ymd日期和一个系数。在这里,对于每年的每个月,我总是有两个特定的日期:每个月的 1 号和 15 号。这就是数据框的外观(我只在这个最小的示例中添加了一些日期,但不应该有任何“跳跃”:我有 10 年期间的连续数据):

         date coeff
1  2009-05-01  2.00
2  2009-05-15  3.00
3  2009-06-01  2.50
4  2009-06-15  4.00
5  2009-10-01  3.65
6  2009-10-15  4.80
7  2010-01-01  2.40
8  2010-01-15  1.90
9  2010-07-01  5.20
10 2010-07-15  4.30

数据帧已准备好在此 fiddle 上使用:http://rextester.com/MOIY96065

我的问题

我需要在数据帧 1 中创建一个新列(名为 data),其中该列是 data$value/Factors$coeff,遵循一个条件:它必须使用coeff 与之前最接近的date 值。

例如:date$value[1] 应除以 factors$coeff[6](10 月 15 日的值),但 date$ value[2] 应除以 factors$coeff[1](5 月 1 日的值)。

我的因素数据框按日期排序。我一直在使用 lubridate 来解析字符串类型的日期,但我不知道如何才能完成这项工作。

最佳答案

您可以使用findInterval()来获取用于选择正确行的索引 来自因素:

(i <- findInterval(date$date, factors$date))
#> [1]  6  1  7 10  4

date$value / factors$coeff[i]
#> [1]  229.1667 2500.0000 1270.8333  627.9070  650.0000

reprex package 创建于 2018-08-09 (v0.2.0.9000)。

数据:

date <- structure(list(date = structure(c(14540, 14365, 14622, 14814, 
14411), class = "Date"), value = c(1100, 5000, 3050, 2700, 2600
)), row.names = c(NA, -5L), class = "data.frame")

factors <- structure(list(date = structure(c(14365, 14379, 14396, 14410, 
14518, 14532, 14610, 14624, 14791, 14805), class = "Date"), coeff = c(2, 
3, 2.5, 4, 3.65, 4.8, 2.4, 1.9, 5.2, 4.3)), row.names = c(NA, 
-10L), class = "data.frame")

关于r - 根据另一个数据框中的日期范围划分数据框中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51744543/

相关文章:

r - 为数据框分配一个因子

java - 无法解析的日期与时区

javascript - 如何根据 Javascript 中的 unix 时间戳以编程方式确定先前的时间段?

java - 通过 java.util.Calendar.add() 添加一周失败

python - 在非 NaN 的列中查找第一个和/或最后一个值的索引

python - 保存带有一些额外信息的 DataFrame

在 R 中使用 NA 重新编码变量

r - 使用 dplyr 将一个 data.frame 的输出通过管道传输到另一个

r - 自举 nls 拟合不良数据期间出现奇异梯度错误

python - 如何根据条件将数据框中的一列分割为多个系列