【问题标题】:Conditional joining data frames R条件连接数据帧 R
【发布时间】:2019-03-14 13:16:24
【问题描述】:

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

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

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 的初学者)。当然,如果有人能提出使用这些软件包的解决方案,我会非常高兴。谢了!

【问题讨论】:

    标签: r date join dplyr fuzzyjoin


    【解决方案1】:

    dplyrtidyr 的组合:

    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")
    

    这将给出相同的结果。

    【讨论】:

    • 使用complete添加了一个迟来的替代方案。
    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 2020-05-23
    • 2017-08-06
    • 2021-10-25
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多