Мы можем использовать lapply
до l oop над list
, выбрать 1-й элемент как «начало», 5-й как «конец», чтобы создать «data.frame
out <- do.call(rbind, lapply(split(d, f), function(x)
data.frame(start = x[1], end = x[5])))
head(out)
# start end
#1 2017-01-01 2017-01-05
#2 2017-01-06 2017-01-10
#3 2017-01-11 2017-01-15
#4 2017-01-16 2017-01-20
#5 2017-01-21 2017-01-25
#6 2017-01-26 2017-01-30
str(out)
#'data.frame': 230 obs. of 2 variables:
#$ start: Date, format: "2017-01-01" "2017-01-06" "2017-01-11" ...
#$ end : Date, format: "2017-01-05" "2017-01-10" "2017-01-15" ...
»
Или другой вариант - вместо вызова data.frame
внутри каждого элемента list
, извлеките 'Date' отдельно и затем выполните окончательный data.frame
lst1 <- split(d, f)
out1 <- data.frame(start = do.call(c, lapply(lst1, `[`, 1)),
end = do.call(c, lapply(lst1, `[`, 5)))
i1 <- is.na(out1$end)
out1$end[i1] <- out1$start[i1]
Или, если OP хотел получить элемент last
, если элементов меньше
i1 <- lengths(lst1) < 5
out1$end[i1] <- do.call(c, lapply(lst1[i1], tail, 1))
Если мы используем код OP, одним из вариантов будет инициализация list
или data.frame
с NA
, а затем обновлять объект на каждом l oop run
out2 <- as.data.frame(matrix(NA, nrow = length(my_date_ranges),
ncol = 2, dimnames = list(NULL, c("start", "end"))))
for(i in seq_along(my_date_ranges)) {
out2$start[i] <- list(my_date_ranges[[i]][1])
out2$end[i] <- list(my_date_ranges[[i]][5])
}
out2$start <- do.call(c, out2$start)
out2$end <- do.call(c, out2$end)