データフレームのリストを作成する方法と、リストからそれらの各データフレームにアクセスする方法を教えてください。
たとえば、これらのデータフレームをリストに入れる方法はありますか。
d1 <- data.frame(y1 = c(1, 2, 3),
y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
y2 = c(6, 5, 4))
これはあなたの質問とは関係ありませんが、関数呼び出しの中では=
ではなく<-
を使いたいのです。 <-
を使用する場合は、作業環境にかかわらず、変数y1
およびy2
を作成することになります。
d1 <- data.frame(y1 <- c(1, 2, 3), y2 <- c(4, 5, 6))
y1
# [1] 1 2 3
y2
# [1] 4 5 6
これは、データフレームに列名を作成するという、一見したところ望ましい効果はありません。
d1
# y1....c.1..2..3. y2....c.4..5..6.
# 1 1 4
# 2 2 5
# 3 3 6
一方、=
演算子は、あなたのベクトルをdata.frame
への引数と関連付けます。
あなたの質問に関しては、データフレームのリストを作ることは簡単です:
d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))
my.list <- list(d1, d2)
他のリスト要素にアクセスするのと同じように、データフレームにアクセスします。
my.list[[1]]
# y1 y2
# 1 1 4
# 2 2 5
# 3 3 6
[
と[[
を使用して、各リスト要素の特定の列と値にアクセスすることもできます。ここにいくつかの例があります。まず、lapply(ldf, "[", 1)
でリストの各データフレームの最初の列にのみアクセスできます。ここで、1
は列番号を表します。
ldf <- list(d1 = d1, d2 = d2) ## create a named list of your data frames
lapply(ldf, "[", 1)
# $d1
# y1
# 1 1
# 2 2
# 3 3
#
# $d2
# y1
# 1 3
# 2 2
# 3 1
同様に、2列目の最初の値にアクセスすることができます。
lapply(ldf, "[", 1, 2)
# $d1
# [1] 4
#
# $d2
# [1] 6
それから[[
を使ってベクトルとして列の値に直接アクセスすることもできます。
lapply(ldf, "[[", 1)
# $d1
# [1] 1 2 3
#
# $d2
# [1] 3 2 1
連続して命名されたデータフレームが多数ある場合は、次のようにデータフレームの目的のサブセットのリストを作成できます。
d1 <- data.frame(y1=c(1,2,3), y2=c(4,5,6))
d2 <- data.frame(y1=c(3,2,1), y2=c(6,5,4))
d3 <- data.frame(y1=c(6,5,4), y2=c(3,2,1))
d4 <- data.frame(y1=c(9,9,9), y2=c(8,8,8))
my.list <- list(d1, d2, d3, d4)
my.list
my.list2 <- lapply(paste('d', seq(2,4,1), sep=''), get)
my.list2
my.list2
は、2番目、3番目、4番目のデータフレームを含むリストを返します。
[[1]]
y1 y2
1 3 6
2 2 5
3 1 4
[[2]]
y1 y2
1 6 3
2 5 2
3 4 1
[[3]]
y1 y2
1 9 8
2 9 8
3 9 8
ただし、上記のリストのデータフレームはもはや名前が付けられていないことに注意してください。データフレームのサブセットを含むリストを作成し、それらの名前を保存したい場合は、これを試すことができます。
list.function <- function() {
d1 <- data.frame(y1=c(1,2,3), y2=c(4,5,6))
d2 <- data.frame(y1=c(3,2,1), y2=c(6,5,4))
d3 <- data.frame(y1=c(6,5,4), y2=c(3,2,1))
d4 <- data.frame(y1=c(9,9,9), y2=c(8,8,8))
sapply(paste('d', seq(2,4,1), sep=''), get, environment(), simplify = FALSE)
}
my.list3 <- list.function()
my.list3
これは
> my.list3
$d2
y1 y2
1 3 6
2 2 5
3 1 4
$d3
y1 y2
1 6 3
2 5 2
3 4 1
$d4
y1 y2
1 9 8
2 9 8
3 9 8
> str(my.list3)
List of 3
$ d2:'data.frame': 3 obs. of 2 variables:
..$ y1: num [1:3] 3 2 1
..$ y2: num [1:3] 6 5 4
$ d3:'data.frame': 3 obs. of 2 variables:
..$ y1: num [1:3] 6 5 4
..$ y2: num [1:3] 3 2 1
$ d4:'data.frame': 3 obs. of 2 variables:
..$ y1: num [1:3] 9 9 9
..$ y2: num [1:3] 8 8 8
> my.list3[[1]]
y1 y2
1 3 6
2 2 5
3 1 4
> my.list3$d4
y1 y2
1 9 8
2 9 8
3 9 8
与えられたものとして、あなたは "たくさんの"似た名前のdata.frameを持っています(ここでd#は#は正の整数です)、以下は@ mark-millerの方法のわずかな改良です。より簡潔で--- named data.framesのリストを返します。リストの各名前は対応する元のdata.frameの名前です。
キーはmget
をls
と一緒に使用しています。質問で提供されたデータフレームd1とd2が環境内で名前d#を持つ唯一のオブジェクトであるならば、
my.list <- mget(ls(pattern="^d[0-9]+"))
どちらが戻ります
my.list
$d1
y1 y2
1 1 4
2 2 5
3 3 6
$d2
y1 y2
1 3 6
2 2 5
3 1 4
このメソッドはls
のpattern引数を利用しているため、正規表現を使用して環境内のオブジェクトの名前を詳細に解析できます。正規表現"^d[0-9]+$"
の代替は"^d\\d+$"
です。
@gregor 指摘 として、最初にdata.framesが名前付きリストに入れられるようにデータ構築プロセスを設定するほうが全体的に良いです。
データ
d1 <- data.frame(y1 = c(1,2,3),y2 = c(4,5,6))
d2 <- data.frame(y1 = c(3,2,1),y2 = c(6,5,4))
これは少し遅れるかもしれませんが、あなたの例に戻ると、私は答えを少しだけ拡張すると思いました。
D1 <- data.frame(Y1=c(1,2,3), Y2=c(4,5,6))
D2 <- data.frame(Y1=c(3,2,1), Y2=c(6,5,4))
D3 <- data.frame(Y1=c(6,5,4), Y2=c(3,2,1))
D4 <- data.frame(Y1=c(9,9,9), Y2=c(8,8,8))
それからあなたは簡単にあなたのリストを作ります:
mylist <- list(D1,D2,D3,D4)
今、あなたはリストを持っていますが、その代わりにそのような古い方法でリストにアクセスする代わりに
mylist[[1]] # to access 'd1'
この機能を使用して、選択したデータフレームを取得して割り当てることができます。
GETDF_FROMLIST <- function(DF_LIST, ITEM_LOC){
DF_SELECTED <- DF_LIST[[ITEM_LOC]]
return(DF_SELECTED)
}
今すぐあなたが欲しいものを手に入れてください。
D1 <- GETDF_FROMLIST(mylist, 1)
D2 <- GETDF_FROMLIST(mylist, 2)
D3 <- GETDF_FROMLIST(mylist, 3)
D4 <- GETDF_FROMLIST(mylist, 4)
余分なビットが役立つことを願っています。
乾杯!
とても簡単です。これが私の提案です:
ワークスペースでデータフレームを選択したい場合は、これを試してください。
Filter(function(x) is.data.frame(get(x)) , ls())
または
ls()[sapply(ls(), function(x) is.data.frame(get(x)))]
これらすべてが同じ結果になります。
is.data.frame
を変更して、is.function
のような他のタイプの変数をチェックすることができます