Вот способ, использующий фиктивные данные, поскольку вы не предоставили ввод.
df1 <- df2 <- df3 <- df4 <- df5 <- data.frame(v1 = 1:3, v2 = 4:6)
lst <- mget(ls(pattern = "^df"))
Я предполагаю, что ваш список выглядит примерно как lst
выше.Здесь у нас есть 5 фреймов данных с 2 столбцами в каждом, и мы перегруппируем его так, чтобы мы получили список из 2 фреймов данных, содержащий 5 столбцов в каждом.
split_idx <- seq_len(unique(lengths(lst))) # in your case, this should give you 1:10
out <- split.default(x = Reduce(cbind, lst), split_idx)
#$`1`
# v1 v1.1 v1.2 v1.3 v1.4
#1 1 1 1 1 1
#2 2 2 2 2 2
#3 3 3 3 3 3
#$`2`
# v2 v2.1 v2.2 v2.3 v2.4
#1 4 4 4 4 4
#2 5 5 5 5 5
#3 6 6 6 6 6
split.default
разбивает список по столбцам.
Если нам нужно изменить имена каждого фрейма данных, мы могли бы сделать
out <- lapply(out, function(x) {
names(x) <- paste0(gsub("(v[0-9]+)\\.+", "\\1", names(x)), "_", 1:5)
x
})
out
#$`1`
# v1_1 v1_2 v1_3 v1_4 v1_5
#1 1 1 1 1 1
#2 2 2 2 2 2
#3 3 3 3 3 3
#$`2`
# v2_1 v2_2 v2_3 v2_4 v2_5
#1 4 4 4 4 4
#2 5 5 5 5 5
#3 6 6 6 6 6