为什么 R 只读取前九个文件

Why is R reading only the first nine files

我正在使用此代码

从文件夹 "test_dir" 中读取多个 .xls
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个数据集,即Book1-Book9,有谁知道原因吗? 在下图中查看我的文件夹结构 Sample Data

这里有很多评论。我会尝试将它们综合成一个明确的答案。原始发布者 (OP) 正在尝试使用名为 readxl 的优秀 R 包中的 read_excel 函数将多个 Excel 工作簿读入 R。 OP 说只能导入前 9 个工作簿。通过 DropBox 提供文件后,r2evans 只能导入工作簿 1、9 和 10,而我只能导入工作簿 1 和 9。进一步询问,OP 说这些文件是 "generated from a software".

我很确定这就是问题所在。 Excel 文件是由软件生成的,大概不是 Excel。 OP 没有说明是什么软件生成了这些文件。他们说 "software" 而不是 Excel 的事实意味着 Excel 没有创建文件。

我还认为工作簿 1 和 9 是由 OP 打开的,然后保存并与其他工作簿一起压缩。事实上,在 Excel 中打开文件后保存文件并不是真正必要的,因为即使文件在没有保存的情况下关闭,Excel 也会为您静默保存。在任何情况下,打开文件然后关闭它(保存或不保存)都会导致文件使用 readxl 神奇地 "importable" 到 R 中。我不知道为什么,但只能假设允许软件(大概不是 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 之外的所有其他文件都给出相同的结果。也就是说,一个空的tibble。所有文件都不为空。它们包含许多行和列。见下文...


"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 包,结果是一样的。 (编辑: 我撒了个谎。结果不一样。这个包在尝试导入文件时出错。不像 readxl 包,它没有给出错误但导入失败数据。)

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 中的文件时出现警告消息这一事实表明,生成这些文件的软件更有可能出现问题。