Действительно вопрос, откуда взялись имена? Безымянный список, например my_list
в вопросе, потерял имена df1
и df2
, как мы можем видеть, посмотрев на его внутреннюю структуру:
dput(my_list) # no df1 or df2 seen
## list(structure(list(c.1..2..3. = c(1, 2, 3), c.3..4..5. = c(3,
## 4, 5)), class = "data.frame", row.names = c(NA, -3L)), structure(list(
## c.6..7..8. = c(6, 7, 8), c.9..10..11. = c(9, 10, 11)), class =
## "data.frame", row.names = c(NA,
## -3L)))
Таким образом, нам нужно создать именованный список в в первую очередь или укажите вектор имен. Мы показываем оба, используя только базовый R.
Именованный список
Сначала создайте именованный список фреймов данных, а затем используйте Map, как показано:
L <- mget(ls("^df")) # create named list
Map(data.frame, L, name = names(L))
Безымянный список
В качестве альтернативы, если все, что у вас есть, это безымянный список, мы можем сопоставить его и вектор имен:
my_list <- list(df1, df2) # unnamed list as in question
Map(data.frame, my_list, name = c("df1", "df2"))
Передать отдельные фреймы данных
Еще один подход - передавать отдельные фреймы данных вместо списка. Поскольку мы не уничтожили исходные имена, создав безымянный список, мы все еще можем их получить. В R 4.0 и более поздних версиях deparse1
можно дополнительно использовать вместо deparse
в коде.
add_names <- function(...) {
mc <- match.call()
Map(data.frame, list(...), names = sapply(mc[-1], deparse))
}
add_names(df1, df2)