![](/img/trans.png)
[英]How can I import multiple .xls files (with multiple sheets each) into R version 3.5.3?
[英]How to apply wildcard when reading multiple sheets from an .xls file using rio::import_list in r
我一直在尝试编写一个代码,该代码将使用 import_list(rio 包)读取 an.xls 文件中的选定工作表,然后 rbinding 并将它们转换为 a.csv 文件。 到目前为止,我已经能够使代码同时读取 xls 文件中的所有工作表,顺序工作表(例如 1:4),但不能根据名称选择工作表。 请帮忙。 我附上了我的代码的当前迭代和我的部分数据。
library(rio)
d <- import_list("allTP.xls", which = (("201901,Xizhi,PM10")), setclass="data.table",range = "A2:Y33", rbind = T, col_names=T, rbind_label = "_file", rbind_fill = TRUE)
which
参数必须是工作表名称的向量。 也就是说,它需要采用这种格式,使用c
function:
which = c("201901,Xizhi,PM10", "201902,Xizhi,PM10", "201902,Wanli,PM10")
或您要导入的任何工作表。
which
参数似乎不支持正则表达式,因此无法使用通配符导入工作表。 但是您可以导入所有工作表,然后使用_file
列将数据单独导出(如果您知道哪个工作表编号是哪个,因为没有保存工作表名称,只有编号)。
在您的数据中,您拥有第一行中的所有信息,但您没有导入它,因为您将范围指定为“A2:Y33”。 如果您 select "A1:Y33" 那么您将获得所有列的“字符”,并且您不希望这样,因为列名从第 2 行开始。
一种解决方案是像您一样导入所有工作表 range="A2:Y33",然后对范围“A1:Y2”重复,将结果保存为d2
。 此范围包含 select 所需的信息。 然后,您可以在_file
d
与d2
合并,并根据d2
中的信息导出单个 csv 文件。
library(rio)
d1 <- import_list("sample_data.xlsx",
setclass="data.table",
range = "A2:Y33", rbind = T,
col_names=T,
rbind_label = "_file",
rbind_fill = TRUE)
对于d2
,我们只导入范围“A1:Y1”,然后是第 1、7、13 和 26 列的子集,并适当地设置名称。
d2 <- setNames(
subset(
import_list("sample_data.xlsx",
setclass="data.table",
range = "A1:Y1", rbind = T,
col_names=F,
rbind_label = "_file"),
select=c(1,7,13,26)),
c("Site","Param","YM","_file"))
然后合并_file
列上的两个数据集。
d3 <- merge(d1, d2, by="_file")
检查数据。
table(d3$Site, d3$Param, d3$YM)
, , = YM: 2019/01
Param: AMB_TEMP(℃) Param: PM10(μg/m3)
Site: Wanli 31 31
Site: Xizhi 31 31
, , = YM: 2019/02
Param: AMB_TEMP(℃) Param: PM10(μg/m3)
Site: Wanli 31 31
Site: Xizhi 31 31
所以有八张表,每张表包含 31 条记录。 但是我们必须清理这些名称,因为如果我们将这些名称用作文件名,R 会抱怨。
d3$Site <- sub(".*: (.+)", "\\1", d3$Site)
d3$Param <- sub(".*: (.+)\\(.+", "\\1", d3$Param)
d3$YM <- sub(".*: (\\d{4})\\/(.+)", "\\1_\\2", d3$YM)
现在拆分所有三个上下文变量的交互
f <- with(d3, split(d3, list(Site, Param, YM)))
并保存到单独的 CSV 文件中。
lapply(names(f), function(x) write.csv(f[[x]], file=paste(x, ".csv", sep="")))
dir()
[1] "Wanli.AMB_TEMP.2019_01.csv" "Wanli.AMB_TEMP.2019_02.csv" "Wanli.PM10.2019_01.csv"
[4] "Wanli.PM10.2019_02.csv" "Xizhi.AMB_TEMP.2019_01.csv" "Xizhi.AMB_TEMP.2019_02.csv"
[7] "Xizhi.PM10.2019_01.csv" "Xizhi.PM10.2019_02.csv"
然后,您可以使用f
或d3
的子集轻松选择仅导出所需的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.