do.callは気持ち悪いのでReduceを積極的に使いたい
リストをデータフレームの形に直すためにはdo.callを使うのが王道?(コチラ)っぽいんだけど、関数名を文字列で指定するのが気持ち悪いので同じような動作をReduceで再現してみた。こっちのほうが好き。
> x <- list(x = 1:5, y = 101:105, z = 1001:1005) > do.call("rbind", x) [,1] [,2] [,3] [,4] [,5] x 1 2 3 4 5 y 101 102 103 104 105 z 1001 1002 1003 1004 1005 > Reduce(function(a,b)rbind(a,b),x) [,1] [,2] [,3] [,4] [,5] a 1 2 3 4 5 b 101 102 103 104 105 b 1001 1002 1003 1004 1005 > do.call("cbind", x) x y z [1,] 1 101 1001 [2,] 2 102 1002 [3,] 3 103 1003 [4,] 4 104 1004 [5,] 5 105 1005 > Reduce(function(a,b)cbind(a,b),x) a b b [1,] 1 101 1001 [2,] 2 102 1002 [3,] 3 103 1003 [4,] 4 104 1004 [5,] 5 105 1005
ヘッダーがちょいと違うけど、同じ動作。xtsオブジェクトでも同じように以下のように書けた。
> library(xts) > x <- xts(1:10 , Sys.Date()+1:10) > y <- xts(11:20, Sys.Date()+2:11) > list.xts <- list(x,y) > do.call("cbind", list.xts) X1.10 X11.20 2011-02-15 1 NA 2011-02-16 2 11 2011-02-17 3 12 2011-02-18 4 13 2011-02-19 5 14 2011-02-20 6 15 2011-02-21 7 16 2011-02-22 8 17 2011-02-23 9 18 2011-02-24 10 19 2011-02-25 NA 20 > Reduce(function(a,b)cbind(a,b),list.xts) ..1 ..2 2011-02-15 1 NA 2011-02-16 2 11 2011-02-17 3 12 2011-02-18 4 13 2011-02-19 5 14 2011-02-20 6 15 2011-02-21 7 16 2011-02-22 8 17 2011-02-23 9 18 2011-02-24 10 19 2011-02-25 NA 20 > do.call("merge", list.xts) X1.10 X11.20 2011-02-15 1 NA 2011-02-16 2 11 2011-02-17 3 12 2011-02-18 4 13 2011-02-19 5 14 2011-02-20 6 15 2011-02-21 7 16 2011-02-22 8 17 2011-02-23 9 18 2011-02-24 10 19 2011-02-25 NA 20 > Reduce(function(a,b)merge(a,b),list.xts) a b 2011-02-15 1 NA 2011-02-16 2 11 2011-02-17 3 12 2011-02-18 4 13 2011-02-19 5 14 2011-02-20 6 15 2011-02-21 7 16 2011-02-22 8 17 2011-02-23 9 18 2011-02-24 10 19 2011-02-25 NA 20
xtsはきちんと日付を見て結合してくれるからいいなあ。