Мы можем использовать stack
stack(mylist)
# values ind
#1 1 A
#2 2 A
#3 3 A
#4 4 B
#5 5 B
#6 6 B
#7 7 B
#8 8 C
#9 9 C
Обновление
Для обновленного вопроса можно использовать melt
из reshape2
или data.table
library(reshape2)
melt(mylist)
# value L1
#1 3658-09-23 A
#2 2390-06-01 A
#3 2744-01-09 A
#4 2432-02-21 A
#5 4077-11-13 B
#6 4022-11-13 B
#7 3923-11-19 C
#8 2836-08-20 C
#9 3411-01-23 C
Или с использованием tidyverse
library(tidyverse)
enframe(mylist) %>%
unnest
# A tibble: 9 x 2
# name value
# <chr> <date>
#1 A 3658-09-23
#2 A 2390-06-01
#3 A 2744-01-09
#4 A 2432-02-21
#5 B 4077-11-13
#6 B 4022-11-13
#7 C 3923-11-19
#8 C 2836-08-20
#9 C 3411-01-23
Тесты
Вот некоторые тесты с использованием четырех опубликованных решений
mylist2 <- rep(mylist, 1e4) #slightly bigger list
system.time({data.table::melt(mylist2)}) #Sotos solution
#user system elapsed
# 3.432 0.025 3.436
system.time({reshape2::melt(mylist2)})
#user system elapsed
# 3.461 0.021 3.472
melt
функции из обоих пакетов имеют лишь небольшую разницу в производительности
system.time({rbindlist(lapply(mylist2, as.data.table), idcol = names(mylist2))})
# user system elapsed
# 2.889 0.160 3.029
system.time({enframe(mylist2) %>%
unnest})
# user system elapsed
# 0.149 0.004 0.152
system.time({data.frame(value = reduce(mylist2, c),
class = rep(names(mylist2), lengths(mylist2)))})
# user system elapsed
# 14.714 8.890 23.550
library(microbenchmark)
microbenchmark(
ak1 = reshape2::melt(mylist2),
ak2 = enframe(mylist2) %>%
unnest,
st1 = data.table::melt(mylist2),
st2 = rbindlist(lapply(mylist2, as.data.table), idcol = names(mylist2)),
unit = 'relative', times = 10L)
#Unit: relative
# expr min lq mean median uq max neval cld
# ak1 26.51333 24.38488 21.52345 23.65577 19.36023 18.71291 10 c
# ak2 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 10 a
# st1 25.34465 24.56934 21.97353 26.27053 19.23078 17.32802 10 c
# st2 16.19268 16.96023 14.28353 16.25288 12.69549 11.58340 10 b