条件连接数据帧 R
Conditional joining data frames R
我有一个有点简单的问题,但我无法正确理解。
我有两个数据框,第一个只包含日期(很多年的每个月),第二个也有日期和一些其他数据,但只有月份发生变化第二个变量。像下面这样:
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 的连接和 fuzzyjoin 包,但我无法正确地使用它(我是 R 的初学者)。当然,如果有人可以使用这些软件包提出解决方案,我将非常高兴。谢谢!
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
(...)
顺便说一下,另一种方法是使用 complete
(来自 tidyr
)跳过首先创建 df1
:
tidyr::complete(df2,Dates.2=seq.Date(as.Date('1999/1/1'), as.Date('2001/5/1'), by = 'month')) %>%
tidyr::fill(Vals,.direction="down")
这将给出相同的结果。
我有一个有点简单的问题,但我无法正确理解。
我有两个数据框,第一个只包含日期(很多年的每个月),第二个也有日期和一些其他数据,但只有月份发生变化第二个变量。像下面这样:
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 的连接和 fuzzyjoin 包,但我无法正确地使用它(我是 R 的初学者)。当然,如果有人可以使用这些软件包提出解决方案,我将非常高兴。谢谢!
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
(...)
顺便说一下,另一种方法是使用 complete
(来自 tidyr
)跳过首先创建 df1
:
tidyr::complete(df2,Dates.2=seq.Date(as.Date('1999/1/1'), as.Date('2001/5/1'), by = 'month')) %>%
tidyr::fill(Vals,.direction="down")
这将给出相同的结果。