Вы можете сделать это простым Map
с substr
; нет необходимости в дополнительных пакетах.
L
должен служить примером смешанного списка data.frame
с и data.table
с:
L
# $`0001playeraway`
# X1 X2 X3 X4
# 1 1 4 7 10
# 2 2 5 8 11
# 3 3 6 9 12
#
# $`0102playeraway`
# X1 X2 X3 X4
# 1 1 4 7 10
# 2 2 5 8 11
# 3 3 6 9 12
#
# $`1003playeraway`
# X1 X2 X3 X4
# 1: 1 4 7 10
# 2: 2 5 8 11
# 3: 3 6 9 12
Метод:
library(data.table)
dat <- do.call(rbind, Map(function(x) cbind(year=substr(names(L)[x], 1, 4), L[[x]]), seq(L)))
dat
# year X1 X2 X3 X4
# 1: 0001 1 4 7 10
# 2: 0001 2 5 8 11
# 3: 0001 3 6 9 12
# 4: 0102 1 4 7 10
# 5: 0102 2 5 8 11
# 6: 0102 3 6 9 12
# 7: 1003 1 4 7 10
# 8: 1003 2 5 8 11
# 9: 1003 3 6 9 12
Поскольку data.table
доминирует в процессе, выполните dat <- as.data.frame(dat)
, если хотите data.frame
после.
Данные
L <- list(`0001playeraway` = structure(list(X1 = 1:3, X2 = 4:6, X3 = 7:9,
X4 = 10:12), class = "data.frame", row.names = c(NA, -3L)),
`0102playeraway` = structure(list(X1 = 1:3, X2 = 4:6, X3 = 7:9,
X4 = 10:12), class = "data.frame", row.names = c(NA,
-3L)), `1003playeraway` = structure(list(X1 = 1:3, X2 = 4:6,
X3 = 7:9, X4 = 10:12), class = c("data.table", "data.frame"
), row.names = c(NA, -3L)))