如何合并随时间变化的变量[R]

如何合并随时间变化的变量[R],r,R,我正在尝试合并,即基于一个公共字符串链接两个数据集。但是,我尝试链接的变量会随着时间的推移而改变,因此合并需要考虑日期,以便链接正确的值。我没有为每个日期的值链接一个矩阵,而是有一个矩阵,它给出了每次值更改的日期 例如,假设我想将苹果和橙子的价格合并到特定日期购买的苹果和橙子列表中。我的第一个数据框(交易)包含一个日期,一个购买发生的日期,以及它是一个苹果还是一个桔子被购买。第二个数据框包含苹果和橙子价格变化的日期,以及变化的内容(在本例中,价格在1月1日变化,但实际上可能是任何日期) >

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

例如,假设我想将苹果和橙子的价格合并到特定日期购买的苹果和橙子列表中。我的第一个数据框(交易)包含一个日期,一个购买发生的日期,以及它是一个苹果还是一个桔子被购买。第二个数据框包含苹果和橙子价格变化的日期,以及变化的内容(在本例中,价格在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

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


这比我习惯在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]
}

transactions$Price这应该可以做到。我相信它可以矢量化,但我对应用程序不太在行

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

transactions$Price由于您无法下载其他软件包,这里有一种基本的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

transactions$Price\u On\u Date\u Purchased由于您无法下载其他软件包,这里有一种基本的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

使用
应用
购买的交易日$Price\u

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
变换(d1,
购买日期的价格=
应用(d1,1,功能(x)
尾部(d2[d2$Item==x[“已购买的项目”]&

d2$Date使用
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
变换(d1,
购买日期的价格=
应用(d1,1,功能(x)
尾部(d2[d2$Item==x[“已购买的项目”]&

d2$Date如果您的数据框中只有这些数据类型,您可以使用一个函数将
character
类型的列重命名为
Item\u purchased
、numeric(或dbl)类型的列要在购买日期定价,等等。这是一个合适的解决方案吗?@mhh在实际数据中,项目,即苹果/橙子,是唯一的代码,请键入数字。您的意思是编写一个函数为每个价格创建唯一的代码吗?这是可能的,但不确定我如何将其链接回交易数据。如果您只有这些数据ta在您的数据框中输入,您可以使用一个函数将
字符类型的列重命名为
购买的物品
,数字(或dbl)类型的列要在购买日期定价,等等。这是合适的解决方案吗?@mhh在实际数据中,项目,即苹果/橙子,是唯一的代码,请键入数字。您的意思是编写一个函数为每个价格创建唯一的代码吗?这是可能的,但不确定如何将其链接回交易数据。