【发布时间】:2013-03-31 08:56:57
【问题描述】:
我有大量的 csv 文件要读入 R。csv 中的所有列标题都是相同的。但我只想将每个文件中的那些行导入到变量在给定范围内(高于最小阈值和低于最大阈值)的数据框中,例如
v1 v2 v3
1 x q 2
2 c w 4
3 v e 5
4 b r 7
过滤 v3 (v3>2 & v3
v1 v2 v3
1 c w 4
2 v e 5
到目前为止,我将所有 csv 中的所有数据导入到一个数据框中,然后进行过滤:
#Read the data files
fileNames <- list.files(path = workDir)
mergedFiles <- do.call("rbind", sapply(fileNames, read.csv, simplify = FALSE))
fileID <- row.names(mergedFiles)
fileID <- gsub(".csv.*", "", fileID)
#Combining data with file IDs
combFiles=cbind(fileID, mergedFiles)
#Filtering the data according to criteria
resultFile <- combFiles[combFiles$v3 > min & combFiles$v3 < max, ]
我宁愿在将每个 csv 文件导入数据框时应用过滤器。我认为 for 循环将是最好的方法,但我不确定如何。 如有任何建议,我将不胜感激。
Edit
在测试了 mnel 的建议后,我得到了一个不同的解决方案:
fileNames = list.files(path = workDir)
mzList = list()
for(i in 1:length(fileNames)){
tempData = read.csv(fileNames[i])
mz.idx = which(tempData[ ,1] > minMZ & tempData[ ,1] < maxMZ)
mz1 = tempData[mz.idx, ]
mzList[[i]] = data.frame(mz1, filename = rep(fileNames[i], length(mz.idx)))
}
resultFile = do.call("rbind", mzList)
感谢所有建议!
【问题讨论】:
-
为什么要在导入时过滤?您当前的解决方案是否存在速度或内存问题?如果它的速度那么问题可能是rbind。如果它是内存,那么它可能仍然是 rbind,但先过滤可能会有所帮助。
-
@Jan van der Laan - 是的,问题是内存...我快用完了,这就是为什么过滤掉不重要的东西应该是要走的路。
-
我建议你查看
sqldf包,它应该可以帮助你。