【问题标题】:Vectorize a Left Join Loop向量化左连接循环
【发布时间】:2020-03-29 02:15:17
【问题描述】:

我正在尝试将循环转换为 lapply 调用,但我在语法上苦苦挣扎。

我有一个只有日期的数据框:

start <- as.Date("2020-03-25")
df <- tibble(date=seq(start,Sys.Date(),"days"))

我还有一个很大的列表,其中的元素是不同长度的时间序列数据。类似:

list_element_1 <- tibble(date=as.Date("2020-03-25"),x=1)
list_element_2 <- tibble(date=as.Date("2020-03-26"),x=2)
list_element_3 <- tibble(date=as.Date("2020-03-27"),x=3)

list <- list(list_element_1,list_element_2,list_element_3)

我想轻松地将大左侧的元素合并到数据范围。我通过这个循环实现了它:

for(i in list) {
  .GlobalEnv=TRUE
  df <- left_join(df,i,by="date")
}

我该如何使用 lapply?

【问题讨论】:

    标签: r loops lapply


    【解决方案1】:

    我们可以使用reduce

    library(purrr)
    library(dplyr)
    c(list(df), list) %>%
           reduce(left_join, by = 'date')
    

    或在base R

    Reduce(function(...) merge(..., by = 'date', all.x = TRUE),  c(list(df), list))
    

    【讨论】:

      【解决方案2】:

      由于这是一个递归选项,使用lapply 不会产生预期的效果。

      使用base R,我们可以做到:

      Reduce(function(x, y) merge(x, y, all.x = TRUE, by = 'date'), c(list(df), list))
      
      #        date x.x x.y  x
      #1 2020-03-25   1  NA NA
      #2 2020-03-26  NA   2 NA
      #3 2020-03-27  NA  NA  3
      #4 2020-03-28  NA  NA NA
      #5 2020-03-29  NA  NA NA
      

      【讨论】:

      • @akrun 抱歉,我在发布答案时没有看到。
      【解决方案3】:

      基础 R 解决方案:

      df_left_joined_list <- merge(df, do.call("rbind", list), by = "date", all.x = TRUE)
      

      【讨论】:

        猜你喜欢
        • 2021-01-20
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 2015-07-06
        • 2019-05-17
        • 2016-08-10
        • 2017-04-29
        • 2013-02-18
        相关资源
        最近更新 更多