首页 > 解决方案 > 如何合并随时间变化的变量 [R]

问题描述

我正在尝试进行合并 - 即基于公共字符串链接两个数据集。但是,我尝试链接的变量会随着时间的推移而发生变化,因此合并需要考虑日期才能链接正确的值。我没有一个矩阵用于在每个日期链接值,而是有一个矩阵,它给出了每次值更改的日期

例如,假设我想将苹果和橙子的价格合并到特定日期购买的苹果和橙子列表中。我的第一个数据框(交易)包含购买日期,以及购买的是苹果还是橙子。第二个数据框包含苹果和橙子价格变化的日期,以及变化的日期(在这个例子中,价格在 1 月 1 日发生变化,但实际上它可以是任何日期。


> transactions <- data.frame(Date_Purchased = as.Date(c("02/01/2018", "02/01/2020", "02/01/2019", "02/01/2020"), format = "%d/%m/%Y"), Item_Purchased = c("APPLE", "APPLE", "ORANGE", "ORANGE"))

> transactions
  Date_Purchased Item_Purchased
1     2018-01-02          APPLE
2     2020-01-02          APPLE
3     2019-01-02         ORANGE
4     2020-01-02         ORANGE


>price <- data.frame(Date=as.Date(c("01/01/2018", "01/01/2019", "01/01/2020", "01/01/2018", "01/01/2019", "01/01/2020"), format = "%d/%m/%Y"), Item = c("APPLE", "APPLE", "APPLE", "ORANGE", "ORANGE", "ORANGE"), Price = c(0.30, 0.35, 0.40, 0.60, 0.70, 0.75))

> price
        Date   Item Price
1 2018-01-01  APPLE  0.30
2 2019-01-01  APPLE  0.35
3 2020-01-01  APPLE  0.40
4 2018-01-01 ORANGE  0.60
5 2019-01-01 ORANGE  0.70
6 2020-01-01 ORANGE  0.75

一个苹果在 2018 年 1 月 2 日的成本是 30c,而它在 2020 年 1 月 2 日的成本是 40c。同样,2019 年 1 月 2 日橙子的成本为 70c,2020 年 1 月 2 日为 75c。

因此,我需要合并的数据集看起来像:


  Date_Purchased Item_Purchased Price_On_Date_Purchased
1     2018-01-02          APPLE                    0.30
2     2020-01-02          APPLE                    0.40
3     2019-01-02         ORANGE                    0.70
4     2020-01-02         ORANGE                    0.75

不幸的是,我在使用的机器上确实受到限制,因为我无法访问 CRAN 库,也无法下载其他软件包,这意味着我无法使用 Neardate() 函数我尝试过的,我认为这很有用。

这比我以前在 R 上所做的水平高出一个水平,所以说实话,我有点不知所措。

标签: r

解决方案


这应该可以解决问题。我确定它可以被矢量化,但我不太擅长应用

transactions$Price <- 0

items <- unique(transactions$Item_Purchased)

for(item_i in seq_along(items)){
   date_idx <- findInterval(transactions$Date_Purchased[transactions$Item_Purchased==items[item_i]],
                            price$Date[price$Item==items[item_i]])
   transactions$Price[transactions$Item_Purchased==items[item_i]] <- price$Price[date_idx]
}

推荐阅读