r - 如何合并随时间变化的变量 [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 上所做的水平高出一个水平,所以说实话,我有点不知所措。
解决方案
这应该可以解决问题。我确定它可以被矢量化,但我不太擅长应用
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]
}
推荐阅读
- javascript - $_GET['productid'] 给出 Undefined 即使我的 url 给出了 id
- python - 我即将放弃我的第一个 python 项目,它正在制作一个不和谐的机器人,这将是我的最后一个问题吗?
- c# - 如何将 OpenGraph 和 Twitter Cards 合并到 c# razor 中的 2sxc 详细信息模板中?
- node.js - How to get data between Graphql Microservices with Shared Database?
- vue.js - 如何从导入“存储”的 vue-router 路由内部提交 vuex 存储突变?
- v4l2loopback - 如何在设备(v4l2loopback)下提供多种分辨率?
- java - 检查文本频道是否为私人频道?JAVA JDA DV8TION
- sql - postgres - 从左到右选择“得分最高”的 column_name
- javascript - 如何在 JavaScript 中分配箭头和输入键盘键?
- node.js - Node.js 缺少 POST 请求的主体