web-dev-qa-db-ja.com

複数のCSVファイルを個別のデータフレームに読み込む

ディレクトリにファイルfile1.csvfile2.csv、...、およびfile100.csvがあると仮定しますC:\ R\Dataそして、それらをすべて別々のデータフレームに読み込みます(例file1file2、...、およびfile1 )。

この理由は、類似した名前を持っているにもかかわらず、ファイル構造が異なるため、リストに含めるのはそれほど便利ではないからです。

lapplyを使用できますが、100個のデータフレームを含む単一のリストを返します。代わりに、これらのデータフレームをグローバル環境に配置します。

複数のファイルをグローバル環境に直接読み込むにはどうすればよいですか?または、代わりに、データフレームのリストの内容をそこに展開するにはどうすればよいですか?

28
Fred

クイックドラフト、テストなし:

  1. list.files() aka dir()を使用して、ファイルのリストを動的に生成します。

  2. これは、forループ内のベクトルに沿って実行されるベクトルを返します。

  3. I番目のファイルを読み取り、assign()を使用してコンテンツを新しい変数file_iに配置します

それはあなたのためのトリックを行う必要があります。

24

返信いただきありがとうございます。

完全を期すために、任意の数の(タブ)区切りファイルをロードするための最終的な答えを示します。この場合、それぞれ6列のデータで、列1は文字、2は因子、残りは数値です。

##Read files named xyz1111.csv, xyz2222.csv, etc.
filenames <- list.files(path="../Data/original_data",
    pattern="xyz+.*csv")

##Create list of data frame names without the ".csv" part 
names <-substr(filenames,1,7))

###Load all files
for(i in names){
    filepath <- file.path("../Data/original_data/",paste(i,".csv",sep=""))
    assign(i, read.delim(filepath,
    colClasses=c("character","factor",rep("numeric",4)),
    sep = "\t"))
}
24
Fred

assignを、データフレームの目的の名前を含む文字変数とともに使用します。

for(i in 1:100)
{
   oname = paste("file", i, sep="")
   assign(oname, read.csv(paste(oname, ".txt", sep="")))
}
14
Hong Ooi

以下は、単にlapplyを使用してdata.framesのリストを展開する方法です。

filenames <- list.files(path="../Data/original_data",
                        pattern="xyz+.*csv")

filelist <- lappy(filenames, read.csv)

#if necessary, assign names to data.frames
names(filelist) <- c("one","two","three")

#note the invisible function keeps lapply from spitting out the data.frames to the console

invisible(lapply(names(filelist), function(x) assign(x,filelist[[x]],envir=.GlobalEnv)))
7
Robert

グローバル環境からリストの要素にアクセスする簡単な方法は、リストをattachすることです。これにより、検索パスに新しい環境が実際に作成され、リストの要素がコピーされるため、アタッチ後に元のリストを削除して、2つの異なるコピーが浮かんでしまうのを防ぐことができます。

2
Aaron

フォルダーからすべてのCSVファイルを読み取り、ファイル名と同じバクターを作成します。

setwd("your path to folder where CSVs are")

filenames <- gsub("\\.csv$","", list.files(pattern="\\.csv$"))

for(i in filenames){
  assign(i, read.csv(paste(i, ".csv", sep="")))
}
1
Manoj Kumar