2

我有一个简单的问题,我无法正确掌握。

我有两个数据框,第一个仅包含日期(每个月持续数年),第二个还包含日期和其他一些数据,但仅包含第二个变量发生变化的月份。像下面这样:

df1 <- data.frame(Dates.1 = seq.Date(as.Date('1999/1/1'), as.Date('2001/5/1'), 'month'))

Dates.2 <- c(seq.Date(as.Date('1999/1/1'), as.Date('2001/5/1'), by = '5 months'))

Vals <- c(10, 20, 15, 44, 70, 50)

df2 <- data.frame(Dates.2, Vals)

我需要做的是加入 df1 和 df2,为 df1 中小于或等于 df2 中的日期的每个日期关联“Vals”中的相应值。输出应如下所示(我想找到一种以矢量化方式进行的方法):

df3 <- cbind(df1,Vals3. = c(10,10,10,10,10,20,20,20,20,20,15,15,15,15,15,
                        44,44,44,44,44,70,70,70,70,70,50,50,50,50))

我尝试过使用 dplyr 的连接和模糊连接包,但我无法正确获得它(我是 R 的初学者)。当然,如果有人能提出使用这些软件包的解决方案,我会非常高兴。谢!

4

1 回答 1

3

dplyr和的组合tidyr

dplyr::left_join(df1,df2,by=c(Dates.1="Dates.2")) %>% 
tidyr::fill(Vals,.direction="down")

结果:

      Dates.1 Vals
1  1999-01-01   10
2  1999-02-01   10
3  1999-03-01   10
4  1999-04-01   10
5  1999-05-01   10
6  1999-06-01   20
7  1999-07-01   20
8  1999-08-01   20
9  1999-09-01   20
10 1999-10-01   20
(...)

顺便说一句,另一种方法df1是首先使用complete(from tidyr) 跳过创建:

tidyr::complete(df2,Dates.2=seq.Date(as.Date('1999/1/1'), as.Date('2001/5/1'), by = 'month')) %>%
tidyr::fill(Vals,.direction="down")

这将给出相同的结果。

于 2018-10-09T17:39:04.677 回答