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