No.03212 複数のデータフレームを併合。  【マツモト】 2007/04/13(Fri) 21:06

複数のデータフレームを一度に merge で併合するために,以下のように関数を定義したのですが,
merge の引数の by= を指定しようとすると,エラーが出てうまくいきません。by を指定できるようにするには,どのようにしたらよろしいでしょうか。ご教示おねがいします。
merge.all<-function(...,x)
{

D<-list(...)[[1]]

for(i in 2:length(list(...)))
{
D<-merge(D,list(...)[[i]],by=x,all=TRUE)
}
return(D)
}

No.03213 Re: 複数のデータフレームを併合。  【青木繁伸】 2007/04/13(Fri) 21:21

質問の仕方の常識として,そのまんま実行するとエラーが再現するように呈示すべきです。
この関数を,どのようなデータフレームに,どのように適用するとエラーが出るんですか。

あなたの問題を解決しようと,エラーが出る条件を再現するような手間を掛けてくれる暇人は,そうはいないと思いますよ。

念のためにいっておきますが,エラーを再現するためのデータなどは,「最小限」であることが,必須条件です。

No.03214 Re: 複数のデータフレームを併合。  【マツモト】 2007/04/13(Fri) 21:47

御返信ありがとうございます。
先ほどは大変失礼な真似をいたしまして,申し訳ありませんでした。
Rを使い始めて日が浅く,常識はずれなことをしてしまいました。

改めてお伺いします。
以 下のように merge を一括して行う関数を定義してみたのですが,by の指定がうまくいっていないようで,実行すると「以下にエラーfix.by(by.x, x) : オブジェクト "ID" は存在しません」というエラーが発生します。どのようにしたら解決できますでしょうか。ご教示お願いします。
merge.all<-function(x,...)
{

D<-list(...)[[1]]

for(i in 2:length(list(...)))
{
D<-merge(D,list(...)[[i]],by=x,all=TRUE)
}
return(D)
}

id<-c(1:5)
height<-c(158,162,177,173,166)
weight<-c(51,63,77,73,44)
age<-c(22,33,24,35,64)
Df1 <- data.frame(ID=id,HEIGHT=height)
Df2 <- data.frame(ID=id,WEIGHT=weight)
Df3 <- data.frame(ID=id,AGE=age)

merge.all(ID,Df1,Df2,Df3)

No.03215 Re: 複数のデータフレームを併合。  【青木繁伸】 2007/04/13(Fri) 22:07

解法は何通りもあるでしょうが,私が書いたのは以下のような関数
> merge2 <- function(dfs, ...)
+ {
+ base <- dfs[1]
+ lapply(dfs[-1], function(i) base <<- merge(base, i, ...))
+ return(base)
+ }
>
> merge2(list(Df1, Df2, Df3), by="ID")
ID HEIGHT WEIGHT AGE
1 1 158 51 22
2 2 162 63 33
3 3 177 77 24
4 4 173 73 35
5 5 166 44 64

No.03216 Re: 複数のデータフレームを併合。  【マツモト】 2007/04/13(Fri) 22:37

とても美しい関数を示していただき,ありがとうございます!
ずっと悩んでいましたので,とてもスッキリいたしました。

なるほど,こんな方法があったんですね。
とても勉強になりました。ありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 040 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る