おそらく、このようなものはあなたが求めているものですか?
df1 <- data.frame(year = 2006, x = 1:3)
df2 <- data.frame(year = 2007, x = 4:6)
df3 <- data.frame(year = 2006, x = 7:9)
df4 <- data.frame(year = 2007, x = 10:12)
l1 <- list(x2006 = df1, x2007 = df2)
l2 <- list(x2006 = df3, x2007 = df4)
lapply(names(l1), function(x) cbind(l1[[x]], l2[[x]]))
####
[[1]]
year x year x
1 2006 1 2006 7
2 2006 2 2006 8
3 2006 3 2006 9
[[2]]
year x year x
1 2007 4 2007 10
2 2007 5 2007 11
3 2007 6 2007 12
cbind()
などよりも適切な関数が他にもあるかもしれませんmerge()
が、これで正しい道をたどることができます。これは明らかに、リストに名前を付けており、それらの名前が と の間l1
で一致していることを前提としていますl2
。
いくつかのコンテキストを追加するために編集
これを機能させるには、いくつかの重要な仮定があります。これらの仮定は次のとおりです。
- あなたのリストオブジェクトは
names
names
各リストの はリスト間で一貫しています
それで、names
私が言及しているのは何ですか?を定義する場所に関するコードを見ると、 と が表示されl1
ます。そのリストで 2 つのオブジェクトを定義しており、2 つの名前と.x2006 = df1
x2007 = df2
df1
df2
x2006
x2007
次のように尋ねると、リストの名前を確認できますnames()
。
names(l1)
####
[1] "x2006" "x2007"
[[
もう 1 つの重要な仮定は、関数を使用して、リスト内のオブジェクトを名前でインデックス付けできることです。例えば:
l1[["x2006"]]
####
year x
1 2006 1
2 2006 2
3 2006 3
したがって、このlapply
関数で行っていることは、 の名前を反復処理しl1
、無名関数を定義し、その関数を使用して 2 つのリスト オブジェクトと[[
にインデックスを付けることです。現在は関数として使用していますが、他のほとんどの関数に置き換えることができます。l1
l2
cbind
cbind
上で述べたように、これは がnames
2 つ以上のリスト オブジェクト間で同じであることを前提としています。たとえば、これは機能しません。
#change the names of the l2 list
names(l2) <- c("foo", "bar")
lapply(names(l1), function(x) cbind(l1[[x]], l2[[x]]))
####
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 3, 0
ただし、names
同じ順序である必要はありません。[[
それが関数の利点の出番です。
#Fix names on l2 again
names(l2) <- c("x2006", "x2007")
l2reverse <- list(x2007 = df4, x2006 = df3)
all.equal(
lapply(names(l1), function(x) cbind(l1[[x]], l2[[x]])),
lapply(names(l1), function(x) cbind(l1[[x]], l2reverse[[x]]))
)
####
[1] TRUE