#r #list #tibble #readxl
#r #Список #tibble #readxl
Вопрос:
Мне нужно прочитать некоторые капризные файлы xlsx в R. Преобразование их в csv приводит к путанице в именах столбцов, поэтому я вынужден использовать альтернативу. Я могу читать свои файлы с помощью библиотеки readxl и функции read_xlsx().
Моя идея состояла в том, чтобы выполнить цикл чтения каждого файла, чтобы проверить их и поместить в список. Затем выполните цикл по каждому элементу списка и выполните работу для каждого файла.
Однако вывод read_xlsx() — это ошибка. Я ничего о них не знаю, но, похоже, им не нравится, когда их включают в список и извлекают из него.
Например, я использую файл Excel, подобный этому
это | это | a | тест |
---|---|---|---|
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
С таким кодом, как этот:
filenames <- list.files(path = "../Data")
dataList <- list()
for (filename in filenames) {
filepath <- paste0("../Data/", filename)
data <- read_xlsx(filepath)
print(data)
dataList[filename] <- data
print(dataList)
}
На выходе будет
# A tibble: 2 x 4
this is a test
<dbl> <dbl> <dbl> <dbl>
1 1 2 3 4
2 5 6 7 8
[[1]]
[1] 1 5
Почему я потерял так много данных? Есть ли какой-нибудь способ создать список tibbles, чтобы позже манипулировать каждым элементом списка?
Ответ №1:
Для доступа к элементу списка вам [[
не нужно [
.
filenames <- list.files(path = "../Data")
dataList <- list()
for (filename in filenames) {
filepath <- paste0("../Data/", filename)
data <- read_xlsx(filepath)
dataList[[filename]] <- data
}
Другим способом достижения этой цели является foreach
package, который возвращает список.
library(foreach)
dataList <- foreach(filename = filenames,
.final = function(x) { setNames(x, filenames) }) %do% {
filepath <- paste0("../Data/", filename)
data <- read_xlsx(filepath)
data
}
Комментарии:
1. О, я только что потратил на это больше часа, и это было так просто… Большое вам спасибо!