Векторизация левого цикла соединения - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь превратить al oop в приятный вызов, но я борюсь с синтаксисом.

У меня есть дата-фрейм с только датой:

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)

Я хочу легко объединить элементы большого левого в диапазон данных. Я достиг этого с этим l oop:

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

Как мне сделать это с lapply?

Ответы [ 3 ]

1 голос
/ 29 марта 2020

Поскольку это рекурсивная опция, использование 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
1 голос
/ 29 марта 2020

Базовый раствор R:

df_left_joined_list <- merge(df, do.call("rbind", list), by = "date", all.x = TRUE)
1 голос
/ 29 марта 2020

Мы можем использовать 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))
...