Сохраните каждый фрейм данных в списке как CSV, и сделайте имя файла таким же, как имя df - R; lapply - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть список данных. Я хотел бы сохранить каждый фрейм данных в отдельный файл CSV и сделать имя файла таким же, как имя фрейма данных.

df <- list(mtcars, iris, ToothGrowth) df <- setNames(df, c("mtcars",
"iris", "ToothGrowth"))

lapply(df, function(a) write.csv(a, file = paste0("C:/home/",
unlist(lapply(names(df)), function (b) b)), ".csv"), row.names = FALSE))

выдает ошибку:

Ошибка в файле (file, ifelse (append, "a", "w")): недействительно Аргумент 'description' Дополнительно: предупреждающее сообщение: In if (file == "") file <- stdout () else if (is.character (file)) {: </p>

Ошибка в файле (file, ifelse (append, "a", "w")): недопустимый аргумент 'description'

Я почти уверен, что проблема во второй команде lapply, но я не могу понять, как "автоматически" назначить имена файлов на основе df name. Любая помощь будет оценена.

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

purrr имеет функции, начинающиеся с i, которые упрощают индексированное отображение. Поскольку вам не нужно ничего возвращать, iwalk будет работать хорошо. С учетом именованного списка iwalk затем применяет функцию с элементом списка и именем элемента списка в качестве аргументов, поэтому вам не нужно никаких дополнительных шагов для извлечения имен, как с помощью базовых функций apply. Мои пути к файлам отличаются только потому, что я на Mac - не стесняйтесь игнорировать это.

df <- list(mtcars, iris, ToothGrowth) 
df <- setNames(df, c("mtcars", "iris", "ToothGrowth"))

purrr::iwalk(df, function(dat, name) write.csv(dat, file = paste0("./", name, ".csv")))
0 голосов
/ 05 сентября 2018

Если вы хотите использовать итерации и data.frames, вам лучше использовать mapply для одновременного обхода обоих списков

mapply(function(dname, data) 
   write.csv(data, file = paste0("C:/home/", dname, ".csv"), row.names = FALSE), 
   names(df), df)

при итерации списка с помощью lapply() имя текущего значения недоступно. Альтернативное использование lapply заключается в повторении имен, а не значений

lapply(names(df), function(dname) 
   write.csv(df[[dname]], file = paste0("C:/home/", dname, ".csv"), row.names = FALSE))
...