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

Ham*_*mao 0 regex r readxl

我正在使用此代码从文件夹“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")
Run Code Online (Sandbox Code Playgroud)

每次,只有前 9 个数据集被读入 r ie Book1-Book9,有谁知道原因?在下图中查看我的文件夹的结构文件夹结构 样本数据

Edw*_*ard 5

这里有很多评论。我会尝试将它们综合成一个明确的答案。原来的海报(OP)正尝试读入多个Excel使用工作簿成Rread_excel从称为优秀的研发包功能readxl。OP 说只能导入前 9 个工作簿。通过 DropBox 提供文件后,r2evans 只能导入工作簿 1、9 和 10,而我只能导入工作簿 1 和 9。在进一步询问中,OP 说这些文件是“从软件生成的”。

我很确定这就是问题所在。Excel 文件是由软件生成的,大概不是由 Excel 生成的。OP 没有说明是什么软件生成了这些文件。他们说“软件”而不是 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
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,“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>
Run Code Online (Sandbox Code Playgroud)

我也尝试使用 XLConnect 包,结果是一样的。(编辑:我撒谎。结果不一样。这个包在尝试导入文件时出错。与 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
Run Code Online (Sandbox Code Playgroud)

因此,这是否是这两个包中的错误值得商榷。我会说不是。当您尝试在 Excel 中打开文件时出现警告消息这一事实表明生成文件的软件更有可能出现问题。