【问题标题】:How to merge variable which is changing over time [R]如何合并随时间变化的变量 [R]
【发布时间】:2020-08-06 16:40:40
【问题描述】:

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

例如,假设我想将苹果和橙子的价格合并到特定日期购买的苹果和橙子列表中。我的第一个数据框(交易)包含购买日期,以及购买的是苹果还是橙子。第二个数据框包含苹果和橙子价格变化的日期,以及变化的日期(在此示例中,价格在 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 日橙子的成本为 70 美分,2020 年 1 月 2 日为 75 美分。

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


  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 上的水平高出一个水平,所以说实话我有点茫然。

【问题讨论】:

  • 如果您的数据框中只有这些数据类型,您可以创建一个函数,将character 类型的列重命名为Item_purchased,将数字(或dbl)类型的列重命名为@987654325 @,ETC。这会是一个合适的解决方案吗?
  • @mhh 在真实数据中,项目,即苹果/橙子,是唯一代码,输入数字。您的意思是编写一个函数来为每个price 创建一个唯一的代码吗?这是可能的,但不确定我如何将其链接回交易数据。

标签: r


【解决方案1】:

使用apply

transform(d1, 
          Price_On_Date_Purchased=
            apply(d1, 1, function(x) 
              tail(d2[d2$Item == x["Item_Purchased"] & 
                        d2$Date <= x["Date_Purchased"], "Price"], 1)))
#   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

【讨论】:

    【解决方案2】:

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

    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]
    }
    

    【讨论】:

      【解决方案3】:

      由于您无法在此处下载其他软件包,因此是基本 R 方法:

      transactions$Price_On_Date_Purchased <- unlist(
           by(transactions, transactions$Item_Purchased, function(x) {
               tmp <- subset(price, Item == x$Item_Purchased)
               tmp$Price[findInterval(x$Date, tmp$Date)]
      }))
      
      transactions
      #  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
      

      我们根据Item_Purchasedsubsetprice数据帧中对应的项目划分transactions。使用findInterval,我们可以找到价格更改的适当日期,并获得相应的Price 值。

      【讨论】:

        猜你喜欢
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 2012-09-06
        • 2023-03-23
        相关资源
        最近更新 更多