3
library(xts)
set.seed(1)
x = xts( cbind(a=1:10,b=20:11) , Sys.Date()+1:10 )
y = xts( runif(10) , Sys.Date()+1:10 )
z = x*y

(x, y) でエラーが発生します:適合しない配列*.default

私が望むのは、x の各列に y の値を掛けることです。

期待される結果:

                   a         b
2012-08-04 0.2655087  5.310173
2012-08-05 0.7442478  7.070354
2012-08-06 1.7185601 10.311361
2012-08-07 3.6328312 15.439532
2012-08-08 1.0084097  3.226911
2012-08-09 5.3903381 13.475845
2012-08-10 6.6127269 13.225454
2012-08-11 5.2863823  8.590371
2012-08-12 5.6620264  7.549369
2012-08-13 0.6178627  0.679649

理想的には、ソリューションは次の場合に機能するはずですindex(x)!=index(y)

余談: 私はこのハックを思いついた:

 z = xts( apply(x,2,function(col) col*y ) , index(x) )

テストデータでは機能しますが、実際のデータではError in array(ans, c(len.a%/%d2, d.ans), if (!all(vapply(dn.ans, is.null) , : 'dimnames' の長さ [1] が配列の範囲と等しくあり ません (まだテスト データの小さな断片でこれを再現できていません)。

Joshua と DWin による回答にはこの問題がないため、簡潔さだけでなく、結果の質においても優れています。

4

3 に答える 3

4

単一列のxtsオブジェクトのサイズを削除するだけで機能するはずです。その後、Rのリサイクルルールが引き継ぐことができます。これは、 DWinのソリューションよりもわずかに優れています。これは、次の場合に正しく機能するためですindex(x) != index(y)

R> (z <- x*drop(y))
                   a         b
2012-08-03 0.2655087  5.310173
2012-08-04 0.7442478  7.070354
2012-08-05 1.7185601 10.311361
2012-08-06 3.6328312 15.439532
2012-08-07 1.0084097  3.226911
2012-08-08 5.3903381 13.475845
2012-08-09 6.6127269 13.225454
2012-08-10 5.2863823  8.590371
2012-08-11 5.6620264  7.549369
2012-08-12 0.6178627  0.679649
R> (z1 <- x*drop(y[1:5]))
                   a         b
2012-08-03 0.2655087  5.310173
2012-08-04 0.7442478  7.070354
2012-08-05 1.7185601 10.311361
2012-08-06 3.6328312 15.439532
2012-08-07 1.0084097  3.226911
于 2012-08-03T04:43:55.543 に答える
3

JoshuaUlrichの答えほど洗練されていませんが、何か違うものを示すために、次のように使用できます。sweep

sweep(x, 1, y, "*")
#                   a         b
#2012-08-04 0.2655087  5.310173
#2012-08-05 0.7442478  7.070354
#2012-08-06 1.7185601 10.311361
#2012-08-07 3.6328312 15.439532
#2012-08-08 1.0084097  3.226911
#2012-08-09 5.3903381 13.475845
#2012-08-10 6.6127269 13.225454
#2012-08-11 5.2863823  8.590371
#2012-08-12 5.6620264  7.549369
#2012-08-13 0.6178627  0.679649
于 2012-08-03T18:50:57.903 に答える
2

yオブジェクトを通常のベクトルに変換します。

> z <-  x * c(coredata(y))
> z
                      a             b
2012-08-03 0.2655086631  5.3101732628
2012-08-04 0.7442477993  7.0703540931
2012-08-05 1.7185600901 10.3113605403
2012-08-06 3.6328311600 15.4395324299
2012-08-07 1.0084096552  3.2269108966
2012-08-08 5.3903381098 13.4758452745
2012-08-09 6.6127268802 13.2254537605
2012-08-10 5.2863823399  8.5903713023
2012-08-11 5.6620263951  7.5493685268
2012-08-12 0.6178627047  0.6796489751
于 2012-08-03T04:27:48.547 に答える