我已经编写了一个基于for循环的脚本来读取多个.xls文件的列,将它们组合为一个数据框,搜索负值并编写一个.txt文件与这些值和文件的名称。
脚本基本上工作,但我有几百个文件要处理,而且速度有点慢。这个版本的脚本只是后来的统计分析的基本框架,我想并行执行以加快速度。
我试图通过lapply和plyr-package应用该函数来避免for-loop,但是在将文件列表传递给“readWorkSheetFromFile”时出现问题(path.expand(filename)中的错误:invalid'path'argument )。将文件列表传递给XLConnect
这里是工作的脚本:
require(XLConnect)
setwd(choose.dir())
input = list.files(pattern = ".xls$")
# creates empty data frame
df = data.frame(Name=NULL, PCr=NULL, bATP=NULL, Pi=NULL)
for(i in seq(along=input)){
data = data.frame(readWorksheetFromFile(input[i], sheet="Output Data",
startRow=2, startCol=c(10, 13, 16), endCol=c(10, 13, 16), header=TRUE))
head(data, n = -1L)
colnames(data) = c("PCr", "bATP", "Pi")
data$Name = file.path(input[i])
attach(data)
df = rbind(data, df)
attach(df)
rm(data)
}
# searches for negative values in df and writes to txt file
neg_val = subset(df, bATP<0 | Pi<0 | PCr<0)
write.table(neg_val, file = "neg_val.txt", sep = "\t", quote=F)
任何解决问题的对策,或其他建议加快执行?
感谢, 马库斯
你的速度问题可能是由于你的[缺乏预分配的(http://www.burns-stat.com/pages/Tutor/ R_inferno.pdf),而不是for循环。 (这个想法对于R来说本质上是慢的,这有点神话。) – joran
感谢您的链接! – Markus