В вашем подходе четыре ошибки.
Во-первых, file.names <- dir(path, pattern =".csv")
извлечет только имена файлов без пути.Итак, когда вы пытаетесь импортировать, read.csv()
не находит.
Построение пути
Вы можете построить правильный путь, включая paste0()
:
path = "~/path/to/csv/"
file.names <- paste0(path, dir(path, pattern =".csv"))
Или file.path()
, которые автоматически добавляют косые черты.
path = "~/path/to/csv"
file.names <- file.path(path, dir(path, pattern =".csv"))
И еще один способ создать путь, для меня более эффективный, - это то, что предложено в ответе, прокомментированном Тунгом.
file.names <- list.files(path = "~/path/to/csv", recursive = TRUE,
pattern = "\\.csv$", full.names = TRUE)
Это лучше, потому что, помимо того, что все выполняется за один шаг, вы можете использовать каталог, содержащий несколько файлов различных форматов.Приведенный выше код будет соответствовать всем файлам .csv в папке.
Импорт, выбор и создание списка
Вторая ошибка в mylist <- c()
.Вы хотите список, но это создает вектор.Итак, правильное значение:
mylist <- list()
И последняя ошибка внутри цикла.Вместо того, чтобы создавать другой список при добавлении, используйте тот же объект, созданный перед циклом:
for(i in 1:length(file.names)){
datatmp <- read.csv(file.names[i], sep=";", stringsAsFactors=FALSE)
listtmp = datatmp[, 6]
mylist <- append(mylist, list(listtmp))
}
mylist
Другой подход, более легкий и понятный, заключается в создании цикла с lapply()
.Просто так:
mylist <- lapply(file.names, function(x) {
df <- read.csv(x, sep = ";", stringsAsFactors = FALSE)
df[, 6]
})
Надеюсь, это поможет!