40

ディレクトリC:\R\Dataにファイルfile1.csvfile2.csv、 ... 、およびfile100.csvがあり、それらすべてを個別のデータ フレーム (たとえば、 file1file2、 ... 、およびfile100 )。

これは、名前が似ていてもファイル構造が異なるため、リストに入れてもあまり役に立たないためです。

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

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

4

9 に答える 9

36

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

完全を期すために、任意の数の (タブ) 区切りファイルをロードするための最終的な回答を次に示します。この場合、それぞれ 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"))
}
于 2011-03-16T01:46:34.207 に答える
30

クイック ドラフト、未テスト:

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

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

  3. i 番目のファイルを読み取り、assign()その内容を新しい変数 file_i に配置するために使用します

それはあなたのためにトリックをするはずです。

于 2011-03-16T01:00:41.500 に答える
17

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

for(i in 1:100)
{
   oname = paste("file", i, sep="")
   assign(oname, read.csv(paste(oname, ".txt", sep="")))
}
于 2011-03-16T01:02:56.530 に答える
11

この回答は、ハドリーの回答をより便利に補完することを目的としています。

OPは、各ファイルを個別のオブジェクトとしてRワークスペースに読み込むことを特に望んでいましたが、この質問に素朴にたどり着いた他の多くの人々は、実際にはファイルを単一のオブジェクトに読み込む方が良いのに、それがやりたいことだと思うかもしれませんデータ フレームのリスト。

記録のために、これを行う方法を次に示します。

#If the path is different than your working directory
# you'll need to set full.names = TRUE to get the full
# paths.
my_files <- list.files("path/to/files")

#Further arguments to read.csv can be passed in ...
all_csv <- lapply(my_files,read.csv,...)

#Set the name of each list element to its
# respective file name. Note full.names = FALSE to
# get only the file names, not the full path.
names(all_csv) <- gsub(".csv","",
                       list.files("path/to/files",full.names = FALSE),
                       fixed = TRUE)

これで、任意のファイルを で参照できるようになりました。これは、ワークスペースに別の変数を配置することよりmy_files[["filename"]]も実際にはそれほど悪くfilenameはなく、多くの場合、はるかに便利です。

于 2015-03-05T21:08:24.977 に答える
8

これは、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)))
于 2013-06-30T14:47:34.067 に答える
3

A simple way to access the elements of a list from the global environment is to attach the list. Note that this actually creates a new environment on the search path and copies the elements of your list into it, so you may want to remove the original list after attaching to prevent having two potentially different copies floating around.

于 2011-03-16T14:31:56.883 に答える
-1
#copy all the files you want to read in R in your working directory
a <- dir()
#using lapply to remove the".csv" from the filename 
for(i in a){
list1 <- lapply(a, function(x) gsub(".csv","",x))
}
#Final step 
for(i in list1){
filepath <- file.path("../Data/original_data/..",paste(i,".csv",sep=""))
assign(i, read.csv(filepath))
}
于 2016-10-24T16:32:05.560 に答える