Как создать список tibbles (из файлов xlsx) в R без потери данных?

#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. О, я только что потратил на это больше часа, и это было так просто… Большое вам спасибо!