向量化左联接循环

时间:2020-03-29 02:15:17

标签: r loops 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做到这一点?

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

由于这是使用lapply的递归选项,因此无法获得理想的效果。

使用基数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

答案 2 :(得分:1)

Base R解决方案:

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