繁体   English   中英

使用 r 中的 rio::import_list 从 .xls 文件中读取多张工作表时如何应用通配符

[英]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 dd2合并,并根据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"

然后,您可以使用fd3的子集轻松选择仅导出所需的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM