r - 导入数据框时过滤多个 csv 文件

标签 r csv import filter

我有大量要读入 R 的 csv 文件。csvs 中的所有列标题都是相同的。但是我只想将每个文件中的那些行导入到变量在给定范围内(高于最小阈值和低于最大阈值)的数据框中,例如

   v1   v2   v3
1  x    q    2
2  c    w    4
3  v    e    5
4  b    r    7

针对 v3 (v3>2 & v3<7) 的过滤应导致:

   v1   v2   v3
1  c    w    4
2  v    e    5

所以我将所有 csvs 中的所有数据导入到一个数据框中,然后进行过滤:

#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)

感谢所有的建议!

最佳答案

这是一种使用 data.table 的方法,它允许您使用 fread(即 faster than read.csv)和 rbindlist一个superfast implementation of do.call(rbind, list(..))非常适合这种情况。它还有一个函数 between

library(data.table)
fileNames <- list.files(path = workDir)
alldata <- rbindlist(lapply(fileNames, function(x,mon,max) {
  xx <- fread(x, sep = ',')
  xx[, fileID :=   gsub(".csv.*", "", x)]
  xx[between(v3, lower=min, upper = max, incbounds = FALSE)]
  }, min = 2, max = 3))

如果单个文件很大并且 v1 始终是整数值,则可能值得将 v3 设置为键然后使用二进制搜索,它也可能会更快地导入一切,然后运行过滤。

关于r - 导入数据框时过滤多个 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15893296/

相关文章:

r - geom_segment 变长错误

python - 如何在 python 中对段落进行编码以在 CSV 文件中使用

python - 将 csv 中的值插入到 mysql 时日期值不匹配

css - IE11 中的@import 问题

c++ - 如何确保 win-builder 使用 c++11 构建我的包?

r - R包的版权

r - 有没有一种方法可以在数据框中绑定(bind)不同数量的行?

javascript - 使用 basil.js 将数据从 CSV 导入到 InDesign

css - 用于保留 .html 导入的 <head></head> 部分的 Outlook 2010 VBA 脚本

javascript - 在nestjs的过滤器中注入(inject)服务