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はきちんと日付を見て結合してくれるからいいなあ。