Мы можем сделать это без набора 57-зависимых пакетов:
metals <- data.frame(Date_from,Date_to,Parameter,conc)
do.call(
rbind.data.frame,
lapply(1:nrow(metals), function(.i) {
data.frame(
Date = seq(as.Date(metals$Date_from[.i]), as.Date(metals$Date_to[.i]), "1 day"),
Parameter = metals$Parameter[.i],
conc = as.double(as.character(metals$conc[.i])),
stringsAsFactors = FALSE
)
})
)
Используя предварительно преобразованный тип фрейма данных из OP:
library(microbenchmark)
microbenchmark(
base = do.call(
rbind.data.frame,
lapply(1:nrow(metals), function(.i) {
data.frame(
Date = seq(metals$Date_from[.i], metals$Date_to[.i], "1 day"),
Parameter = metals$Parameter[.i],
conc = metals$conc[.i],
stringsAsFactors = FALSE
)
})
),
base2 = {
lst <- Map(
seq, MoreArgs = list(by = "1 day"), metals$Date_from, metals$Date_to
)
cbind(
Date = do.call(c, lst),
metals[rep(seq_len(nrow(metals)), lengths(lst)), c("Parameter", "conc")]
)
},
tidy = metals %>%
mutate(Date = map2(Date_from, Date_to, seq, by = "1 day")) %>%
select(-Date_from, -Date_to) %>%
unnest %>%
select(Date, Parameter, conc)
)
## Unit: microseconds
## expr min lq mean median uq max neval
## base 2472.997 2615.7025 2758.6086 2678.6220 2765.6375 8085.012 100
## base2 716.680 784.0505 835.0233 815.9715 869.8095 1166.096 100
## tidy 7331.729 7671.4065 8644.6002 7889.7080 8080.5925 82376.963 100