2017-06-05 1 views
2

助けを借りてありがとう:なぜRで定数xtsオブジェクトを分割すると、行列オブジェクトが失われます(Date列が失われます)?

なぜRで定数xtsオブジェクトを分割すると、行列オブジェクトになります(日付/インデックス列が失われます)? 結果のオブジェクトは、入力xtsのようなxtsオブジェクトで、列の値を定数で除算したものになります。なぜこれが起こり、それを避けるのですか?

私が観察した問題の例。

コードエキス:

TradeProfit <- as.xts(ifelse(is.na(lag(GLD$Signal, 1)) == 0 & GLD$Signal != lag(GLD$Signal, 1), GLD$TotTradCapital, NA)) 
TradeProfit <- na.omit(TradeProfit) 

TradeProfitPerc <- ifelse(is.na(lag(TradeProfit,1)) == 0, TradeProfit/100, NA) 
TradeProfitPerc <- na.omit(TradeProfitPerc) 

> class(TradeProfit) 
[1] "xts" "zoo" 

> head(TradeProfit) 
       Signal 
2012-08-15 0.000000 
2012-11-02 6.970001 
2012-11-06 6.970001 
2013-08-09 46.410003 
2013-08-14 46.410003 
2013-09-27 46.380004 

head(TradeProfitPerc) 
     Signal 
[1,] 0.06970001 
[2,] 0.06970001 
[3,] 0.46410003 
[4,] 0.46410003 
[5,] 0.46380004 
[6,] 0.46380004 

> class(TradeProfitPerc) 
[1] "matrix" 
> 

問題はTradeProfitPercは私が保持したい日付コラム/インデックスを失っていることです。また、TradeProfitはxtsオブジェクトなので、なぜディビジョンがxtsを行列オブジェクトに変換するような奇妙な振る舞いを引き起こすのでしょうか?どのようにしてxtsプロパティを保持できますか? ありがとう!

答えて

2

ここで最小の、再現性の例は次のとおり

library(quantmod) 
getSymbols("GLD") 
GLD$GLD.SMA <- SMA(Cl(GLD), 50) 
GLD$Signal <- Cl(GLD) > GLD$GLD.SMA 

TradeProfit <- as.xts(ifelse(!is.na(lag(GLD$Signal, 1)) & 
          GLD$Signal != lag(GLD$Signal, 1), 100, NA)) 
TradeProfit <- na.omit(TradeProfit) 

TradeProfitPerc <- ifelse(!is.na(lag(TradeProfit,1)), TradeProfit/100, NA) 
TradeProfitPerc <- na.omit(TradeProfitPerc) 

問題ない列名の論理マトリックス中XTSオブジェクト結果にis.na、及びifelseを呼び出すと同じ形状のオブジェクトを返すことです属性を最初の引数として使用します。だからTradeProfitPercは、行名のない行列です。これは、ifelseに渡される最初の引数の構造体なのでです。

& GLD$Signal != lag(GLD$Signal, 1)のためにTradeProfitを計算する場合、これは問題ありません。 GLD$Signal != lag(GLD$Signal, 1)比較ではxtsオブジェクトが返され、xtsオブジェクトとxts以外のオブジェクトの論理比較によってxtsオブジェクトが生成されます。たとえば:

str(FALSE & xts(TRUE, Sys.Date())) 
An 'xts' object on 2017-06-05/2017-06-05 containing: 
    Data: logi [1, 1] FALSE 
    Indexed by objects of class: [Date] TZ: UTC 
    xts Attributes: 
NULL 

あなたが直接ifelseやサブセット化を回避することにより、これを避けることができます。

GLD$TotTradCapital <- 500 
# rows where Signal is NA will be FALSE and therefore not included in TradeProfit 
TradeProfit <- GLD[GLD$Signal != lag(GLD$Signal, 1), "TotTradCapital"] 
TradeProfitPerc <- TradeProfit/100 
+0

Joshua Ulrichに感謝します。私のコードが機能していない理由と解説の両方を提供する詳細な答えです。 –

+0

あなたの答えを再度読んでください、なぜあなたはまた、変数TradeProfitの場合、is.na()呼び出しによってインデックス/日付列が削除されないのか説明できますか? –

+0

@FilippoNeri:done。ありがとうございます。 –

1

私の場合は、既存のオブジェクトに列を追加するだけで、xtsクラスが保持されます。

GLD <- xts(matrix(1:10,ncol=2),Sys.Date()+0:4) 
colnames(GLD) <- c("Signal","TotTradCapital") 
TradeProfit <- as.xts(ifelse(is.na(lag(GLD$Signal, 1)) == 0 & GLD$Signal != lag(GLD$Signal, 1), GLD$TotTradCapital, NA)) 
TradeProfit <- na.omit(TradeProfit) 

TradeProfit$TradeProfitPerc <- ifelse(!is.na(lag(TradeProfit,1)), TradeProfit/100, NA) 

      Signal TradeProfitPerc 
2017-06-06  7    NA 
2017-06-07  8   0.08 
2017-06-08  9   0.09 
2017-06-09  10   0.10 
+0

感謝@PLapointeに答えるために時間を割いて。はい、ソリューションが機能します。私は特に私のコードがxtsでどんなコードが動作するかどうかをよく理解し、同様の誤りを繰り返さないようにするために、なぜ私のコードが動作しないのかを理解しようとしています。だから、私は上記のis.naが論理行列を返すことを説明するために、J Ulrichが以下のように答えなければならない。ありがとう! –

+0

@FilippoNeri良い。 Joshuaは 'xts'パッケージの著者です。彼は一番よく知っている。 –

関連する問題