为什么 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 中的文件时出现警告消息这一事实表明,生成这些文件的软件更有可能出现问题。
我正在使用此代码
从文件夹 "test_dir" 中读取多个 .xlslibrary(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,有谁知道原因吗?
在下图中查看我的文件夹结构
这里有很多评论。我会尝试将它们综合成一个明确的答案。原始发布者 (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 中的文件时出现警告消息这一事实表明,生成这些文件的软件更有可能出现问题。