Почему R читает только первые девять файлов - PullRequest
0 голосов
/ 16 февраля 2020

Я читаю несколько .xls из папки "test_dir" с этим кодом

library(readxl)
files <- list.files(path = "./test_dir", pattern = "*.xls", full.names = T)
tbl <- sapply(files, read_excel, simplify=FALSE, skip=7) %>% 
bind_rows(.id = "id")

каждый раз, только первые 9 наборов данных считываются в r т.е. Book1-Book9, кто-нибудь знает причину Почему ? см. структуру моей папки на изображении ниже Folder Structure Пример данных

1 Ответ

5 голосов
/ 16 февраля 2020

Здесь много комментариев. Я постараюсь объединить их в один четкий ответ. Оригинальный постер (OP) пытается прочитать несколько книг Excel в R, используя функцию read_excel из превосходного пакета R под названием readxl . ОП говорит, что только первые 9 рабочих книг могут быть импортированы. После предоставления файлов через DropBox r2evans мог импортировать только рабочие книги 1, 9 и 10, в то время как я мог импортировать только рабочие книги 1 и 9. В ходе дальнейшего опроса OP сказал, что файлы были «сгенерированы из программного обеспечения».

Я совершенно уверен, что в этом заключается проблема. Файлы Excel были сгенерированы программным обеспечением, предположительно, не Excel. ОП не сказал, какое программное обеспечение генерировало файлы. Тот факт, что они сказали «программное обеспечение», а не Excel, будет означать, что Excel не создавал файлы.

Я также считаю, что рабочие книги 1 и 9 были открыты OP, а затем сохранены и затем упакованы в архив вместе с другие. На самом деле, сохранение файлов после их открытия в Excel не является обязательным требованием, так как Excel выполняет автоматическое сохранение для вас, даже если файл закрыт без сохранения. В любом случае, открытие файла и последующее его закрытие (с сохранением или без сохранения) приводит к тому, что файл волшебным образом «импортируется» в R с использованием readxl. Я не знаю почему, но могу только предположить, что причиной проблемы является разрешение программного обеспечения (предположительно, не Excel) на создание файла Excel. Обратите внимание, что здесь нет ошибок и предупреждений. Данные просто пусты (без строк, см. Ниже попытку импорта "Book11.xls"). У меня нет никакого ответа, кроме как открыть каждый файл один за другим, а затем закрыть их (с сохранением или без).

> Book11 <- read_excel("E:/SO/Book11.xls", skip=7)
> Book11
# A tibble: 0 x 0

Редактировать : Обратите внимание, что "Book11 .xls "на самом деле содержит данные. Функция read_excel успешно считывает файл (без ошибок), но безуспешно импортирует данные (опять же, без ошибок). Это странно для меня. Все остальные файлы, кроме Book1.xls и Book9.xls, дают одинаковые результаты. То есть пустой тибл. Все файлы не пусты. Они содержат много строк и столбцов. См. Ниже ...


"Book1.xls" был вероятно , открытый OP (или кем-то еще) и может быть импортирован:

> Book1 <- read_excel("E:/SO/Book1.xls", skip=7)
> Book1
# A tibble: 1,524 x 35
   Position `Position [µm]` `Al-K` `Si-K` `S-KA` `K-KA` `Ca-KA` `Ti-KA`
      <dbl>           <dbl>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>   <dbl>
 1        0             0     3     11.3   1179       0   3076.   3.67 
 2        1            14.5   6.33  10.3   1230.      0   3030.   2.67 
 3        2            29.0   1.33  15.3   1160.      0   3080.   3.33 
 4        3            43.4   1     11.3   1232.      0   3112.   0.667
 5        4            57.9   3.67   8.67  1227.      0   3116.   1.67 
 6        5            72.4   5.33   8.67  1313       0   3153    6    
 7        6            86.9   5.67  16     1181.      0   3100.   0.333
 8        7           101.    2     15     1218       0   3130.   1.33 
 9        8           116.    2.33  11.3   1207.      0   3078.   1.33 
10        9           130.    3     15.3   1249       0   3089.   7    
# ... with 1,514 more rows, and 27 more variables: `Mn-KA` <dbl>,
#   `Fe-KA` <dbl>, `Mg-K` <dbl>, `Na-KA` <dbl>, `Cr-KA` <dbl>,
#   `Co-KA` <dbl>, `Ni-KA` <dbl>, `Cu-KA` <dbl>, `Zn-KA` <dbl>,
#   `As-KA` <dbl>, `P-KA` <dbl>, `Sr-KA` <dbl>, `Zr-KA` <dbl>,
#   `Mo-KA` <dbl>, `Rb-KA` <dbl>, `Br-KA` <dbl>, `Y-KA` <dbl>,
#   `Cl-KA` <dbl>, `Ga-KA` <dbl>, `Cd-KA` <dbl>, `V-KA` <dbl>,
#   `Cs-KA` <dbl>, `Ba-KA` <dbl>, `Hf-LA` <dbl>, `Pb-LA` <dbl>,
#   `U-LA` <dbl>, `Th-LA` <dbl>

Я также пытался использовать пакет XLConnect, и результаты были такими же. ( Edit : я говорю al ie. Результаты не совпадают. Этот пакет выдает ошибку при попытке импортировать файл. В отличие от пакета readxl, который дает NO ERROR, но не может импортировать данные .)

library(XLConnect)
> wb <- loadWorkbook("E:/SO/Book11.xls")
Error: LeftoverDataException (Java): Initialisation of record 0x92(PaletteRecord) left 2 bytes remaining still to be read.

> wb <- loadWorkbook("E:/SO/Book1.xls") # No error

Итак, является ли это ошибкой в ​​этих двух пакетах, остается спорным. Я бы сказал, нет. Тот факт, что при открытии файлов в Excel появляется предупреждающее сообщение, говорит о том, что это скорее всего проблема с программным обеспечением, которое генерировало файлы.

...