他の回答にはお見せする方法あなたはときdata.framesのリストを作るためにすでに例えば、data.framesの束をd1
、d2
順次指定されたデータフレームを持つことは問題であり、リストでそれらを置くことはaは、...良い修正ですが、最初のリストにない一連のdata.framesがリストにないようにすることをお勧めします。
他の回答は、データフレームをリスト要素に割り当て、それらにアクセスする方法など、多くの詳細を提供します。ここでも少し説明しますが、主要なポイントは、たくさんのデータが得られるまで待たないことです。data.frames
それらをリストに追加します。リストから始めます。
この回答の残りの部分では、シーケンシャル変数を作成したくなるいくつかの一般的なケースを取り上げ、リストに直接進む方法を示します。Rのリストを初めて使用する場合は、リストの要素へのアクセスとアクセスの違いは何ですか?[[
[
もご覧ください。。
最初からリスト
そもそもd1
d2
d3
、...を作成しないでくださいdn
。要素d
をn
含むリストを作成します。
複数のファイルをデータフレームのリストに読み込む
これは、ファイルを読み込むときに簡単に実行できます。多分あなたはdata1.csv, data2.csv, ...
ディレクトリにファイルを持っています。あなたの目標はと呼ばれるdata.framesのリストですmydata
。最初に必要なのは、すべてのファイル名を持つベクターです。これは貼り付け(例:)で作成できますが、適切なファイルをすべて取得my_files = paste0("data", 1:5, ".csv")
する方がおそらく簡単list.files
ですmy_files <- list.files(pattern = "\\.csv$")
。正規表現を使用してファイルを照合できます。ヘルプが必要な場合は、他の質問で正規表現の詳細をご覧ください。このようにすれば、CSVファイルが適切な命名規則に従っていない場合でも、すべてのCSVファイルを取得できます。また、特定のCSVファイルをその中から選択する必要がある場合は、より洗練された正規表現パターンを使用できます。
この時点で、ほとんどのR初心者はfor
ループを使用しますが、問題はありません。問題なく動作します。
my_data <- list()
for (i in seq_along(my_files)) {
my_data[[i]] <- read.csv(file = my_files[i])
}
それを行うためのよりRに似た方法lapply
は、上記のショートカットであるを使用することです
my_data <- lapply(my_files, read.csv)
もちろん、read.csv
必要に応じて他のデータインポート機能を代用してください。readr::read_csv
またはdata.table::fread
、より高速になります。または、ファイルタイプごとに異なる機能が必要になる場合もあります。
どちらの方法でも、ファイルと一致するようにリスト要素に名前を付けると便利です
names(my_data) <- gsub("\\.csv$", "", my_files)
# or, if you prefer the consistent syntax of stringr
names(my_data) <- stringr::str_replace(my_files, pattern = ".csv", replacement = "")
データフレームをデータフレームのリストに分割する
これは非常に簡単で、基本機能split()
はあなたのためにそれを行います。データの1つまたは複数の列、またはその他の必要なもので分割できます。
mt_list = split(mtcars, f = mtcars$cyl)
# This gives a list of three data frames, one for each value of cyl
これは、相互検証のためにデータフレームを細かく分割するための良い方法でもあります。たぶんmtcars
、トレーニング、テスト、および検証の部分に分割する必要があります。
groups = sample(c("train", "test", "validate"),
size = nrow(mtcars), replace = TRUE)
mt_split = split(mtcars, f = groups)
# and mt_split has appropriate names already!
データフレームのリストのシミュレーション
たぶん、次のようなデータをシミュレートしているでしょう:
my_sim_data = data.frame(x = rnorm(50), y = rnorm(50))
しかし、誰が1つのシミュレーションしかしませんか?あなたはこれを100回、1000回、もっとやりたいです!しかし、ワークスペースに10,000データフレームが必要ではありません。replicate
それらを使用してリストに入れます:
sim_list = replicate(n = 10,
expr = {data.frame(x = rnorm(50), y = rnorm(50))},
simplify = F)
この場合は特に、本当に個別のデータフレームが必要かどうか、または「グループ」列を持つ単一のデータフレームも同様に機能するかどうかを検討する必要があります。data.table
またはを使用dplyr
すると、データフレームに対して「グループごと」に処理を行うのが非常に簡単になります。
データをリストに入れませんでした:(次回は行いますが、今何ができますか?
それらが奇妙な品揃えである場合(これは珍しいことです)、単純にそれらを割り当てることができます。
mylist <- list()
mylist[[1]] <- mtcars
mylist[[2]] <- data.frame(a = rnorm(50), b = runif(50))
...
あなたは、パターンで指定されたデータフレームを使用している場合、例えばdf1
、df2
、df3
、とあなたがリストでそれらをしたい、あなたのことができget
ますが、名前と一致する正規表現を書くことができた場合、それらを。何かのようなもの
df_list = mget(ls(pattern = "df[0-9]"))
# this would match any object with "df" followed by a digit in its name
# you can test what objects will be got by just running the
ls(pattern = "df[0-9]")
# part and adjusting the pattern until it gets the right objects.
通常、mget
複数のオブジェクトを取得し、それらを名前付きリストで返すために使用されます。その対応物get
は、単一のオブジェクトを取得してそれを返すために使用されます(リストではありません)。
データフレームのリストを単一のデータフレームに結合する
一般的なタスクは、データフレームのリストを1つのビッグデータフレームに結合することです。それらを互いの上にスタックしたい場合はrbind
、それらのペアに使用しますが、データフレームのリストには、次の3つの適切な選択肢があります。
# base option - slower but not extra dependencies
big_data = do.call(what = rbind, args = df_list)
# data table and dplyr have nice functions for this that
# - are much faster
# - add id columns to identify the source
# - fill in missing values if some data frames have more columns than others
# see their help pages for details
big_data = data.table::rbindlist(df_list)
big_data = dplyr::bind_rows(df_list)
(同様に、列に対してcbind
またはdplyr::bind_cols
を使用します。)
データフレームのリストをマージ(結合)するには、これらの回答を確認できます。多くの場合、アイデアをReduce
一緒にmerge
(または他の結合関数)を使用してまとめます。
なぜデータをリストに入れるのですか?
あなたは、各データフレームに似たものをやりたいので、リストに類似したデータを入れ、などの機能lapply
、sapply
do.call
、パッケージ、および古い機能はそれを行うことは容易にそれを作ります。リストを使って簡単に物事を行う人々の例は、至る所にあります。purrr
plyr
l*ply
低いforループを使用する場合でも、で変数名を作成paste
し、でオブジェクトにアクセスするよりも、リストの要素をループする方がはるかに簡単get
です。デバッグも簡単です。
スケーラビリティについて考えてください。あなたが本当に唯一の3つの変数が必要な場合、それは使用に罰金ですd1
、d2
、d3
。しかし、実際に6が必要であることが判明した場合、それはより多くのタイピングです。そして次に、10または20が必要になったときに、コードの行をコピーして貼り付けることに気づき、おそらくfind / replaceをに変更d14
してd15
、これがプログラミングの本来の姿ではないと考えています。あなたがリストを使用する場合は、3例、30例、および300例との違いは、コードのほとんどの1行である---全く変更しない例あなたの番号が自動的例えば、によって検出された場合、どのように多くの.csv
あなたのファイルですディレクトリ。
数値インデックス以外のものを使用してデータフレームにアクセスする場合は、リストの要素に名前を付けることができます(両方を使用できますが、これはXORの選択ではありません)。
全体として、リストを使用すると、よりクリーンで読みやすいコードを作成できるようになり、バグが減り、混乱が減ります。
=
ない<-
内部data.frame()
。<-
あなたが作成y1
しy2
、あなたのグローバル環境で使用することによって、あなたのデータフレームはあなたがそれが望んでいるものではありません。