Добавление списка в цикле (R) - PullRequest
1 голос
/ 01 апреля 2019

Я хочу использовать цикл для чтения нескольких файлов CSV и добавления списка в R.

path = "~/path/to/csv/"
file.names <- dir(path, pattern =".csv")
mylist=c()

for(i in 1:length(file.names)){

  datatmp <- read.csv(file.names[i],header=TRUE, sep=";", stringsAsFactors=FALSE)
  listtmp = datatmp[ ,6]
  finallist <- append(mylist, listtmp)
}
finallist

Для каждого файла CSV желаемый столбец имеет разную длину.В конце я хочу получить полный добавленный список со всеми значениями в этом определенном столбце из всех CSV-файлов.

Я довольно плохо знаком с R, поэтому я не уверен, что мне не хватает ...

1 Ответ

0 голосов
/ 01 апреля 2019

В вашем подходе четыре ошибки.

Во-первых, 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]
})

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...