excel 使用rio::import_list从.xls文件阅读多个工作表时应用通配符

8e2ybdfx  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(137)

我一直在尝试写一个代码,将使用import_list(rio包)读取.xls文件中选定的工作表,然后rbinding并将其转换为.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)

Sample data

gudnpqoy

gudnpqoy1#

which参数必须是工作表名称的向量。也就是说,它需要使用c函数采用以下格式:

which = c("201901,Xizhi,PM10", "201902,Xizhi,PM10", "201902,Wanli,PM10")

或要导入的任何图纸。
which参数似乎不支持正则表达式,因此无法使用通配符导入工作表。但您可以导入所有工作表,然后使用_file列选择要单独导出的数据(如果您知道哪个工作表编号是哪个,因为工作表名称不保存,只有编号)。
在数据中,所有信息都在第一行,但由于指定范围为“A2:Y33”,因此不导入此信息。如果选择“A1:Y33”,则所有列都将获得“字符”,但由于列名从第2行开始,因此您不希望这样。
一个解决方案是导入所有工作表,range=“A2:Y33”,就像您之前所做的那样,然后对范围“A1:Y2”重复此操作,将结果另存为d2。此范围包含您需要选择的信息。然后,您可以在_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

一共有8张表,每张表包含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的子集仅导出所需的数据。

相关问题