2016-03-23 8 views
0

Rのリストまたは別々のデータフレームにインポートする必要がある537個の.txtファイルがあります。重要なデータを追加する必要はありませんすべてを別々に保つRに複数の.txtファイルをインポートし、実際のデータ行にスキップ

各ファイルの名前が変更されているため、ファイル名はすべて統一されています。各ファイルには、雑多な情報がたくさんあるヘッダーセクションがあります。このヘッダーセクションは、ファイルに応じて12〜16行です。データについては、5〜7列あります。データはすべてタブで区切られています。列の数は5〜9列の間で異なりますが、列の順序は必ずしも同じではありません。そのため、列名はデータでインポートできます(列名はファイル間で統一されています)。次のようにファイルの形式は次のとおり

ヘッダ

ヘッダ

ヘッダ

ヘッダ... 16行

ヘッダと列の名前の間の空間の((数まで)¥

日付(\ t)データコール1(\ t)データコール2(\ t)データコール3(\ t)データコール

(列名とユニット間(NO空行))

MM/DD/YYYY(\ tの)HH:MM:SS(\ t)は単位(\ tの)単位(\ tの)単位(\ T )単位

((1ユニットとデータとの間の空行))

2016年1月31日(\ tの)14時32分02秒(\ tの)14.9(\ tの)25.3(\ tの)15.8私は必要なものをおさらいする(\ tの)25.6

(最大4000行の(データ反復))

:個々のDへのファイルのインポート すべてフレームまたはデータフレームのリストを含むことができる。 ヘッダー情報を「日付」の行にスキップします(単位と空の行が続く2つの行を削除する可能性があります)ので、列名とその後のデータが残ります。

ここでは、私がコードのために取り組んできたことの粗いコピーがあります。考え方は、すべてのファイルをRにインポートした後、各ファイルの1-2の列の最大値を決定することです。次に、各ファイルの2つの最大値を含む2つの列を持つ各ファイルに対して1つの行を持つ単一のファイルをエクスポートします。

##list files and create list for data.frames 
path <- list.files("Path",pattern = NULL, all.files=FALSE,full.names=TRUE) 
files <- list() 

##Null list for final data to be extracted to 
results <- NULL 

##add names to results list (using file name - extension 
results$name <- substr(basename(path),1,nchar(basename(Path))-4) 

##loop to read in data files and calculate max 
for(i in 1:length(path){ 
    ##read files 
    files[[i]] <- read.delim(path[[i]],header = FALSE, sep = "\t", skip = 18 

    ##will have to add code: 
    ##"if columnx exists do this; if columny exists do this" 
    ##convert 2 columns for calculation to numeric 
    x.x <- as.numeric(as.character(files$columnx)) 
    x.y <- as.numeric(as.character(files$columny)) 

    ##will have to add code: 
    ##"if column x exists, do this....if not, "NA" 
    ##get max value for 2 specific columns 
    results$max.x <- max(files$columnx) 
    results$max.y <- max(files$columny) 
} 

##add results to data frame 
max <- data.frame(results) 

##export to .csv 
write.csv(max,file="PATH") 

私が今知っている、私のコードだけで(最大はずっと後のファイルにまで来ていないので、1つのまたは2行をスキップすると、私を傷つけることはありません)データに過去のすべてをスキップし、そしてそれは想定してい列は各ファイル内で同じ順序です。これは恐ろしい練習で、私のデータポイントの約5%でいくつかの悪い結果が出ますが、これを正しく実行したいのです。私の主な関心事は、使用可能な形式でRにデータを取得することです。次に、他の計算やコンバージョンを追加できます。私はRには新しく、検索の2日後に、私はすでにフォーラムに投稿しておく必要があるヘルプが見つかりませんでした。ヘッダの構造はライン\に続くN行\ n個のデータは、我々は行番号を見つけるためにgrepを使用することができると仮定すると

+1

上記のアプローチがかなり進んでいるようです。ヘッダー情報の問題を解決するために、ここでは私のアプローチがあります(詳細はありません)。ヘッダー<-readLines(path [[i]]、n = 20)で最初の20行を読み込みます。 grep( "^ Date"、ヘッダー)を使用して、Dateで始まる行を探します。次に、 "strsplit"を使用して列見出しの配列を作成します。 grepコマンドの結果から、データの開始行を計算し、それを上のread.delim行に渡すことができます。幸運 – Dave2e

+0

ありがとう、Dave2e。 @TJGorrieはあなたのコードにあなたの応答を追加しました。だからあなたの2人の間で、私は私よりもはるかに近いです! – JRW485

+0

進歩があると聞いてうれしいです。問題が発生した場合は、更新されたコードとサンプルデータを追加して新しい質問を投稿してください。このフォーラムでは、出発点と希望するエンドポイントのサンプルを見るのが好きです。 – Dave2e

答えて

0

ここで、「MM/DD/YYYY」など

system("grep -nr 'mm/dd/yyyy' ran.txt", intern=T) 
# ran.txt is an arbitrary text file I created, we will substitute 
# 'ran.txt' with path[[i]] later on. 
#[1] "6:mm/dd/yyyy\thh:mm:ss\tunits\tunits\tunits\tunits" 

これから、strsplitの前にある数字に出力し、その引数をskipの必要な値として使用することができます。

as.numeric(strsplit(system("grep -nr 'mm/dd/yyyy' ran.txt", intern=T),":")[[1]][1]) 
# [[1]][1] will specify the first element of the output of strsplit as 
# in the output the hh:mm:ss also is split. 
# [1] 6 

呼び出された行と実際のデータの間に空の行があるため、これに1を加えてデータの読み取りを開始できます。

Thusly:

##list files and create list for data.frames 
path <- list.files("Path",pattern = NULL, all.files=FALSE,full.names=TRUE) 
files <- list() 

##Null list for final data to be extracted to 
results <- NULL 

##add names to results list (using file name - extension 
results$name <- substr(basename(path),1,nchar(basename(Path))-4) 

##loop to read in data files and calculate max 
for(i in 1:length(path){ 
##read files 
# Calculate the number of rows to skip. 
# Using Dave2e's suggestion: 
header <-readLines("path[[i]]", n=20) 
skip <- grep("^mm/dd/yy", header) 
#Add one due to missing line 
skip <- skip + 1 
files[[i]] <- read.delim(path[[i]], 
         header = FALSE, 
         sep = "\t", 
         skip = skip) 

##will have to add code: 
##"if columnx exists do this; if columny exists do this" 
##convert 2 columns for calculation to numeric 
x.x <- as.numeric(as.character(files$columnx)) 
x.y <- as.numeric(as.character(files$columny)) 

##will have to add code: 
##"if column x exists, do this....if not, "NA" 
##get max value for 2 specific columns 
results$max.x <- max(files$columnx) 
results$max.y <- max(files$columny) 
} 

##add results to data frame 
max <- data.frame(results) 

##export to .csv 
write.csv(max,file="PATH") 

私はについてのすべてをカバーしていると思います。

+0

コードを更新しましたが、次のエラーが表示されます: "システム内のエラー(ペースト(" grep -nr 'mm/dd/yyyy' "、パス[[i]])、インターン= T): { をスキップする行数を計算する##ファイル を読ん##:(長さ(パス)は、i 1)のデータファイル で読み取ることが '##ループ:「グレップは」 は、ここに私のコードですが見つかりません」 [strsplit( システム(貼り付け(grep -nr \ 'mm/dd/yyyy \' "、パス[[i]])、 intern = T)、": ")[[[ 1]] [1]) skip < - skip + 1 ファイル[[i]] < - read.delim(path [[i]]、ヘッダー= FALSE、sep = "\ t"、スキップ=スキップ) } ' – JRW485

+0

これは私の間違いでした、私は@ dave2eコメントを組み込むために私の答えを修正しました。これはあなたがしたいことをやることにもなります。 – TJGorrie

+0

私の間違いとして、私はあなたがLinuxを使っていると仮定しました。あなたはWindowsを使用している可能性が高いと推測しています。そうすれば、あなたはRtoolsをインストールしていない限り、 'grep'を認識しません。 – TJGorrie

関連する問題