我正在尝试将循环转换为延迟调用,但是我在语法上苦苦挣扎。
我有一个只有日期的数据框:
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做到这一点?
答案 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)