2017-08-07 5 views
0

私はRにはかなり新しく、助けが必要です。私は、001から332までの複数のCSVファイルを用意しています。それらをすべて1つのdata.frameにまとめたいと思います。これまで私が行ってきたことです:関数を使用して、複数のcsvファイルを含むdata.frameをRで作成するにはどうすればよいですか?

filesCSV <- function(id = 1:332){ 

    fileNames <- paste(id) ## I want fileNames to be a vector with the names of all the csv files that I want to join together 
    for(i in id){ 
     if(i < 10){ 
     fileNames[i] <- paste("00",fileNames[i],".csv",sep = "") 

} 
     if(i < 100 && i > 9){ 
     fileNames[i] <- paste("0", fileNames[i],".csv", sep = "") 

} 
else if (i > 99){ 
    fileNames[i] <- paste(fileNames[i], ".csv", sep = "") 
} 

} 
    theData <- read.csv(fileNames[1], header = TRUE) ## here I was trying to create the data.frame with the first csv file 
    for(a in 2:332){ 
     theData <- rbind(theData,read.csv(fileNames[a])) ## here I wanted to use a for loop to cycle through the names of files in the fileNames vector, and open them all and add them to the 'theData' data.frame 


} 
    theData 
} 

ありがとうございます、ありがとう!

+0

の代わりに、forループを使用する必要がありますときのケースに対応するためだけに必要なアイデア、 pattern引数は、ファイル名の正規表現を定義すると便利でしょう。 –

+0

@qqqこれは、実際の質問が行バインディングに関するものである間に、多くのファイルの列バインディングまたはマージを扱うので、良いデュープターゲットではありません。 – Uwe

答えて

1

おおよそお使いの機能が既に機能しているようです。どうした?

は、ファイル名を構築:

infiles <- sprintf("%03d.csv", 1:300) 

%03d手段:挿入を は、とにかくここにあなたがそれをやりたい達成するために、より多くの慣用Rの道は、3行のコードに全体の機能を低下させるだろう長さが30)に埋め込まれた整数値d。詳細は?sprintf()のヘルプを参照してください。

ファイルを読む:

res <- lapply(infiles, read.csv, header = TRUE) 

はlapplyベクター "infiles" の各要素に引数header = TRUEで機能read.csvをマッピングし、(この場合data.frameslistで)listを返し

データフレームをまとめてバインドする:

do.call(rbind, res)

これはdf1...dfnはあなたが非常に接近していたlistres

0

のelmentsあるrbind(df1, df2, df3, df4, ..., dfn)を入力するのと同じです。ファイルへの0 Sを追加し、最終的なデータは、ちょうど `list.files`を使用する方が良いだろうcsvファイルを読み込むか、rbind

filesCSV <- function(id = 1:332){ 
    library(stringr) 
    # Append 0 ids in front 
    fileNames <- paste(str_pad(id, 3, pad = "0"),".csv", sep = "") 

    # Initially the data is NULL 
    the_data <- NULL 
    for(i in seq_along(id) 
    { 
    # Read the data in dat object 
    dat <- read.csv(fileNames[i], header = TRUE) 
    if(is.null(the_data) # For the first pass when dat is NULL 
    { 
     the_data <- dat 
    }else{ # For all other passes 
     theData <- rbind(theData, dat) 
    } 
    } 
    return(the_data) 
} 
関連する問題