3

R に読み込みたい多数の csv ファイルがあります。csv の列見出しはすべて同じです。しかし、変数が特定の範囲内 (最小しきい値を超えており、最大しきい値を下回っている) のデータ フレームに、各ファイルから行のみをインポートしたいと考えています。

   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

したがって、すべての csv からすべてのデータを 1 つのデータ フレームにインポートしてから、フィルタリングを行います。

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

すべての提案をありがとう!

4

3 に答える 3

3

これは、この状況に最適なの超高速実装である(より高速な)data.tableを使用できるようにするアプローチです。機能もありますfreadread.csvrbindlistdo.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場合があります。すべてをインポートしてからフィルタリングを実行する方が速い場合もあります。

于 2013-04-09T04:41:19.967 に答える
2

データをインポートする前に「フィルタリング」を行いたい場合は、 sqldf パッケージread.csv.sqlから使用してみてください

于 2013-04-09T04:43:17.067 に答える