2017-11-24 7 views
0

私はRには新しく、正確なループの仕方はわかりません。 ここに私の問題があります:フォルダ内に約160のcsvファイルがあり、それぞれ特定の名前が付いています。各ファイルには、 "HL.X.Y.Z。"というパターンがあります。ここでX = "Region"、Y = "cluster"、Z = "point"です。私がする必要があるのは、これらのcsvファイルをすべて読み込み、名前から文字列を抽出し、各csvファイルの文字列で列を作成し、これらのcsvファイルをすべて単一のデータフレームにバインドすることです。いくつかのcsvファイルのcbind列を

setwd("C:/Users/worddirect") 
files.names<-list.files(getwd(),pattern="*.csv") 
files.names 
head(files.names) 
>[1] "HL.1.1.1.2F31CA.150722.csv" "HL.1.1.2.2F316A.150722.csv" 
[3] "HL.1.1.3.2F3274.150722.csv" "HL.1.1.4.2F3438.csv"   
[5] "HL.1.10.1.3062CD.150722.csv" "HL.1.10.2.2F343D.150722.csv" 

は、すべてのファイルを読み取るために、このようにすることだけで正常に動作:

files.names 
    for (i in 1:length(files.names)) { 
    assign(files.names[i], read.csv(files.names[i],skip=18)) 
      } 

は、この作品のような個別のCSVファイルのための余分な列を追加する。ここ は私がやろうとしています何のいくつかのコードがありますファイン:

test<-cbind("Region"=rep(substring(files.names[1],4,4),times=nrow(HL.1.1.1.2F31CA.150722.csv)), 
     "Cluster"=rep(substring(files.names[1],6,6),times=nrow(HL.1.1.1.2F31CA.150722.csv)), 
     "Point"=rep(substring(files.names[1],8,8),times=nrow(HL.1.1.1.2F31CA.150722.csv)), 
     HL.1.1.1.2F31CA.150722.csv) 
head(test) 
    Region Cluster Point   Date.Time Unit Value 
1  1  1  1 6/2/14 11:00:01 PM C 24.111 
2  1  1  1 6/3/14 1:30:01 AM C 21.610 
3  1  1  1 6/3/14 4:00:01 AM C 20.609 

ただし、上記のforループは機能しません。

files.names 
    for (i in 1:length(files.names)) { 
    assign(files.names[i], read.csv(files.names[i],skip=18)) 
    cbind("Region"=rep(substring(files.names[i],4,4),times=nrow(i)), 
     "Cluster"=rep(substring(files.names[i],6,6),times=nrow(i)), 
     "Point"=rep(substring(files.names[i],8,8),times=nrow(i)), 
     i) 
      } 
>Error in rep(substring(files.names[i], 4, 4), times = nrow(i)) : 
    invalid 'times' argument 

最後のステップは、すべてのcsvファイルを1つのデータフレームにバインドすることです。

私は何か提案を感謝します。私がやったことをする簡単な方法があれば、私はあまりにも感謝します!

答えて

0

を使用することができます。 apply()ファミリのファンクションは、暗黙のforループのように動作し、関数引数を介して渡された各アイテムに1つ以上の操作を適用します。

Rのもう1つの重要な特徴は、無名関数です。 lapply()と匿名関数を組み合わせることで、マルチファイル読み取りの問題を解決できます。

setwd("C:/Users/worddirect") 
files.names<-list.files(getwd(),pattern="*.csv") 
# read csv files and return them as items in a list() 
theList <- lapply(files.names,function(x){ 
    theData <- read.csv(x,skip=18) 
    # bind the region, cluster, and point data and return 
    cbind(
      "Region"=rep(substring(x,4,4),times=nrow(theData)), 
      "Cluster"=rep(substring(x,6,6),times=nrow(theData)), 
      "Point"=rep(substring(x,8,8),times=nrow(theData)), 
      theData) 
}) 
# rbind the data frames in theList into a single data frame 
theResult <- do.call(rbind,theList) 

に関しては、

はレン

+0

おい、あなたは魔術師です!完璧に働いた。したがって、この場合、「read.csv(x)」はなぜ機能しますか?私は、各csvを読み込み、他の列を追加するために 'for'ループを実行しなければならないと思った。 –

+0

こんにちは@CaesarGan。このテクニックの詳細については、私の記事[抽出演算子の形式 - 割り当て1の概念](https:// github。Johns Hopkinsのデータ科学のスペシャライゼーション* R Programmingをサポートするために書いた、com/lgreski/datasciencectacontent/blob/master/markdown/rprog-extractOperator.md#concepts-for-r-programming --- programming-assignment-1) * コース。また、あなたが役に立ったと答えた場合には、回答を受け入れるか、またはアップアップしてください。 –

+0

素晴らしい、ありがとう! –

0

iは、nrowプロパティを持たない番号です。

あなたはこの問題を解決するためのより多くのR-のような方法がapply()機能であるR.における問題を解決するために多くの方法がありますが、次のコード

result = data.frame() 

for (i in 1:length(files.names)) { 
    assign(files.names[i], read.csv(files.names[i],skip=18)) 
    result = rbind(
        cbind(
         "Region"=rep(substring(files.names[i],4,4),times=nrow(files.names[i])), 
         "Cluster"=rep(substring(files.names[i],6,6),times=nrow(files.names[i])), 
         "Point"=rep(substring(files.names[i],8,8),times=nrow(files.names[i])), 
         files.names[i])) 
} 
+0

Kppatelパテル、面白い、ありがとうございました。残念ながら、この場合、私はまだ同じエラーが発生しています: "部分的なエラー(部分文字列(files.names [i]、4,4)、times = nrow(i)):無効な 'times'引数" このループを使用して各csvファイルの行数を取得する方法はまだ完全にはわかりません(各csvは異なるnrowsを持っています) –

+0

RstudioまたはRを使用していますか?Rstudioを使用している場合、ブレークポイント時に発生します。または、基本的なprintステートメントだけを使用できます。 –

+0

ハム、それは分かりませんでした。驚くばかり。私はヒントをありがとう! –