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 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る