2

2 つのリストがあります。リスト内のすべてのコンポーネントはデータ フレームです。2 つのリストは対称的です。どちらにも、2006 年から 2012 年のデータ フレームが含まれていますが、テーマが異なります。データ フレームを '水平方向' (つまり、最初のリストの 2006 年のものと 2 番目のリストの 2006 年のものなど) をマージして、データ フレームの 3 番目のリストを取得したいと思います。私はlapplyでそれを行う方法を理解しようとしましたが、その機能について私が理解していなかったことがあるはずです.

助けていただけますか?

ありがとうございました。

4

3 に答える 3

1

おそらく、このようなものはあなたが求めているものですか?

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

いくつかのコンテキストを追加するために編集

これを機能させるには、いくつかの重要な仮定があります。これらの仮定は次のとおりです。

  1. あなたのリストオブジェクトはnames
  2. names各リストの はリスト間で一貫しています

それで、names私が言及しているのは何ですか?を定義する場所に関するコードを見ると、 と が表示されl1ます。そのリストで 2 つのオブジェクトを定義しており、2 つの名前と.x2006 = df1x2007 = df2df1df2x2006x2007

次のように尋ねると、リストの名前を確認できますnames()

names(l1)
####
[1] "x2006" "x2007"

[[もう 1 つの重要な仮定は、関数を使用して、リスト内のオブジェクトを名前でインデックス付けできることです。例えば:

l1[["x2006"]]
####
  year x
1 2006 1
2 2006 2
3 2006 3

したがって、このlapply関数で行っていることは、 の名前を反復処理しl1、無名関数を定義し、その関数を使用して 2 つのリスト オブジェクトと[[にインデックスを付けることです。現在は関数として使用していますが、他のほとんどの関数に置き換えることができます。l1l2cbindcbind

上で述べたように、これは がnames2 つ以上のリスト オブジェクト間で同じであることを前提としています。たとえば、これは機能しません。

#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
于 2013-11-05T17:26:26.513 に答える
1

mapplyここでも使えるかも。

あなたが求めているかもしれないものの3番目の解釈は次のとおりです。

いくつかのサンプルデータ:

DT1 <- data.frame(A=1:3, B=letters[1:3])
DT2 <- data.frame(A=4:5, C=letters[4:5])
l1 <- list(DT1,DT2)
DT1 <- data.frame(A=1:3, B=letters[7:9])
DT2 <- data.frame(A=4:5, C=letters[11:12])
l2 = list(DT1,DT2)

mergemapply:

mapply(FUN=function(x, y) merge(x, y, by="A"), 
       l1, l2, SIMPLIFY=FALSE)
# [[1]]
#   A B.x B.y
# 1 1   a   g
# 2 2   b   h
# 3 3   c   i
# 
# [[2]]
#   A C.x C.y
# 1 4   d   k
# 2 5   e   l

参考のため....

で行われた質問の@Chaseの解釈は次のmapplyとおりです。

mapply(cbind, l1, l2, SIMPLIFY=FALSE)
# $x2006
#   year x year x
# 1 2006 1 2006 7
# 2 2006 2 2006 8
# 3 2006 3 2006 9
# 
# $x2007
#   year x year  x
# 1 2007 4 2007 10
# 2 2007 5 2007 11
# 3 2007 6 2007 12

@Codoremifa によるあなたの質問の解釈は次のmapplyとおりです。

mapply(FUN=function(x, y) merge(x, y), 
       l1, l2, SIMPLIFY=FALSE)
# [[1]]
#   A B C
# 1 1 a g
# 2 2 b h
# 3 3 c i
# 
# [[2]]
#   A B C
# 1 4 d k
# 2 5 e l

より役立つのは、サンプルデータと期待される出力を投稿して、何をしようとしているのかについての推測が少なくなるようにすることです:-)

于 2013-11-05T18:13:54.253 に答える