r-向量化左连接循环



我正试图将循环转换为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")
}

我该如何使用翻领呢?

我们可以使用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))

由于这是一个递归选项,使用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

基本R解决方案:

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

最新更新