Вы на самом деле довольно близки, и использование lapply()
действительно хорошая идея. Как вы заявляете, проблема в том, что в качестве аргумента требуется только один list
, но вы хотите работать с двумя. mapply()
- это функция в base R
, в которую можно вводить несколько списков и циклически переключаться между ними. lapply()
и mapply()
оба предназначены для создания / манипулирования объектами в R
, но вы хотите записать файлы и не заинтересованы в выводе в R
. В пакете purrr
есть функции walk*()\
, которые полезны, когда вы хотите циклически проходить по спискам и заинтересованы только в создании побочных эффектов (в вашем случае сохранение файлов).
purrr::walk2()
занимает два списка , так что вы можете предоставить данные и имена файлов одновременно.
library(purrr)
Сначала я создаю некоторые примеры данных (я в основном уже использую здесь ту же концепцию, что и ниже):
test_data <- map(1:5, ~ data.frame(
a = sample(1:5, 3),
b = sample(1:5, 3),
c = sample(1:5, 3)
))
walk2(test_data,
paste0("species_data/", 1:5, "test.csv"),
~ write.csv(.x, .y))
Вместо того, чтобы получить пути к файлам и затем убрать путь, чтобы получить имена файлов, я просто вызываю list.files()
, один раз с full.names = TRUE
и один раз с full.names = FALSE
.
NDOP_filepaths <-
list.files(
path = "species_data",
pattern = "*.csv$",
full.names = TRUE,
recursive = FALSE
)
NDOP_filenames <-
list.files(
path = "species_data",
pattern = "*.csv$",
full.names = FALSE,
recursive = FALSE
)
Теперь я передаю два списка в purrr::walk2()
. Используя ~
перед фигурными скобками, я могу определить анонимную функцию более элегантно, а затем использовать .x
и .y
для ссылки на записи первого и второго списка.
walk2(NDOP_filepaths,
NDOP_filenames,
~ {
species <- read.csv(.x)
species <- species[, 1:2]
species$species <- gsub(".csv", "", .y)
write.csv(species, .x)
})
Узнайте больше о purrr
на purrr.tidyverse.org .
Кроме того, вы можете просто извлечь имя файла в l oop и придерживаться lapply()
или использовать purrr::map()
/ purrr::walk()
, вот так:
lapply(NDOP_filepaths,
function(x) {
species <- read.csv(x)
species <- species[, 1:2]
species$species <- gsub("species///|.csv", "", x)
write.csv(species, gsub("species///", "", x))
})