按最近日期和另一个变量加入 R 中的两个数据框
Joining two data frames in R, by nearest date and one other variable
我有两个数据框,一个价格数据集和一个调查数据集,我需要在最近的日期加入。日期不完全匹配,我需要价格数据集与调查数据集中最近的日期相匹配。 非常有助于我回答如何在最接近的日期匹配。然而,我已经意识到我还需要加入区域数据集,以及最近的日期。我知道如何在最近的日期加入,我知道如何在地区加入,但不幸的是我不知道如何在最近的日期和完全相同的地区加入。
这是一些示例代码以及我一直在尝试的代码
#generating sample dataset
set.seed(1234)
price <- data.frame(region = sample(LETTERS[1:3],15,replace = TRUE), price = rnorm(15),price_date=sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 15))
survey <- data.frame(region = sample(LETTERS[1:3],15,replace = TRUE), survey_date=sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 15))
#this works to join on the closest date, however, the regions don't match, which is a problem
library(data.table)
setDT(price)
setDT(survey)
join <- price[survey,on=.(price_date=survey_date),roll="nearest"]
基本上我想做的是将 price
的 date/region 观察与最近的日期相匹配,survey
中的相同区域观察,我不太确定这该怎么做。非常感谢任何帮助。
您可以将区域添加到 on
条件:
price[survey,.(region,price,x.price_date,survey_date),on=.(region,price_date=survey_date),roll="nearest"][]
region price x.price_date survey_date
<char> <num> <Date> <Date>
1: A 0.88010416 1999-10-26 1999-09-05
2: B 0.31026217 1999-12-25 1999-12-31
3: A -1.68732684 1999-04-27 1999-06-02
4: C 0.00500695 1999-08-09 1999-05-11
5: C 0.00500695 1999-08-09 1999-03-24
6: B -0.03763026 1999-08-12 1999-09-02
7: C -0.64701901 1999-12-24 2000-01-01
8: B -0.03763026 1999-08-12 1999-08-06
9: C 0.00500695 1999-08-09 1999-08-03
10: A 0.88010416 1999-10-26 1999-11-22
11: C 1.37001035 1999-09-15 1999-10-03
12: B 0.01831663 1999-07-01 1999-06-18
13: A -0.62743621 1999-03-20 1999-03-12
14: B 0.72397606 1999-02-18 1999-03-02
15: C -0.64701901 1999-12-24 1999-12-18
注意使用 x.
显示 LHS 日期。
我有两个数据框,一个价格数据集和一个调查数据集,我需要在最近的日期加入。日期不完全匹配,我需要价格数据集与调查数据集中最近的日期相匹配。
这是一些示例代码以及我一直在尝试的代码
#generating sample dataset
set.seed(1234)
price <- data.frame(region = sample(LETTERS[1:3],15,replace = TRUE), price = rnorm(15),price_date=sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 15))
survey <- data.frame(region = sample(LETTERS[1:3],15,replace = TRUE), survey_date=sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 15))
#this works to join on the closest date, however, the regions don't match, which is a problem
library(data.table)
setDT(price)
setDT(survey)
join <- price[survey,on=.(price_date=survey_date),roll="nearest"]
基本上我想做的是将 price
的 date/region 观察与最近的日期相匹配,survey
中的相同区域观察,我不太确定这该怎么做。非常感谢任何帮助。
您可以将区域添加到 on
条件:
price[survey,.(region,price,x.price_date,survey_date),on=.(region,price_date=survey_date),roll="nearest"][]
region price x.price_date survey_date
<char> <num> <Date> <Date>
1: A 0.88010416 1999-10-26 1999-09-05
2: B 0.31026217 1999-12-25 1999-12-31
3: A -1.68732684 1999-04-27 1999-06-02
4: C 0.00500695 1999-08-09 1999-05-11
5: C 0.00500695 1999-08-09 1999-03-24
6: B -0.03763026 1999-08-12 1999-09-02
7: C -0.64701901 1999-12-24 2000-01-01
8: B -0.03763026 1999-08-12 1999-08-06
9: C 0.00500695 1999-08-09 1999-08-03
10: A 0.88010416 1999-10-26 1999-11-22
11: C 1.37001035 1999-09-15 1999-10-03
12: B 0.01831663 1999-07-01 1999-06-18
13: A -0.62743621 1999-03-20 1999-03-12
14: B 0.72397606 1999-02-18 1999-03-02
15: C -0.64701901 1999-12-24 1999-12-18
注意使用 x.
显示 LHS 日期。