2017-02-12 8 views
0

私はRに本当に新しく、私はまだ()関数のために頭を抱えています。私のデータ(MergedData)のサンプルは、hereにリンクされています(私は長さについてお詫び申し上げます、できるだけ短くしようとしました)。私は小さなプロジェクトに取り組んでいる、と私は、次の機能を持っている:for()関数で印刷された値を変数として保存しますか?

new.trend <- function(MergedData) 
{ 
    ret <- as.list(rep(NA, length(MergedData))) 
    ma.sig <- ma.crossover(MergedData) 
    pricebreak <- price.channel(MergedData) 
    sig <- intersect(which((ma.sig[1,])==1), which(!pricebreak[1,]==0)) 
    for (i in sig) { #Calculates output variables based on active signals 
    x <- MergedData[[i]] 
    x <- xts(x[,-1], order.by=x[,1]) 
    dev20 <- (x[,4]-SMA(x[,4], n=20))/x[,4]*100 
    dev50 <- (x[,4]-SMA(x[,4], n=50))/x[,4]*100 
    RSI <- RSI(x[,4], n=14) 
    ret[[i]]<- na.omit(merge(tail(dev20, n=1L), tail(dev50, n=1L), tail(RSI, n=1L))) 
    } 
    na.omit(print(ret)) 
} 
print(new.trend(MergedData)) 

問題/問題

リターン(RET)は、この戻っている:

> new.trend(MergedData) 
[[1]] 
      EUR.LAST EUR.LAST.1  EMA 
2017-02-09 -0.6968559 0.3526983 44.68176 

[[2]] 
[1] NA 

[[3]] 
      GBP.LAST GBP.LAST.1  EMA 
2017-02-09 -0.1920461 1.027927 52.27664 

[[4]] 
      CHF.OPEN CHF.OPEN.1  EMA 
2017-02-09 0.5066387 -0.7241689 52.56533 

[[5]] 
[1] NA 

[[6]] 
[1] NA 

[[7]] 
[1] NA 

[[8]] 
[1] NA 

[[9]] 
[1] NA 

[[10]] 
[1] NA 

[[11]] 
[1] NA 

[[12]] 
[1] NA 

[[13]] 
      PLN.CLOSE PLN.CLOSE.1  EMA 
2017-02-09 0.2824105 -1.569392 48.24069 

[[14]] 
[1] NA 

[[15]] 
      TRY.CLOSE TRY.CLOSE.1  EMA 
2017-02-09 -2.315328 -0.2501765 42.52731 

[[16]] 
      ZAR.CLOSE ZAR.CLOSE.1  EMA 
2017-02-09 -0.09598239 -1.492148 46.06286 

[[17]] 
[1] NA 

[[18]] 
      CLP.CLOSE CLP.CLOSE.1  EMA 
2017-02-09 -0.2433194 -2.112368 40.93616 

[[19]] 
[1] NA 

[[20]] 
      MXN.CLOSE MXN.CLOSE.1  EMA 
2017-02-09 -2.460443 -3.490762 34.67792 

[[21]] 
      PEN.CLOSE PEN.CLOSE.1  EMA 
2017-02-09 -0.4138617 -1.974541 37.84737 

[[22]] 
      CNY.CLOSE CNY.CLOSE.1  EMA 
2017-02-09 -0.08749199 -0.5004658 44.39283 

[[23]] 
      IDR.CLOSE IDR.CLOSE.1  EMA 
2017-02-09 -0.4064827 -0.631571 35.91677 

[[24]] 
      INR.CLOSE INR.CLOSE.1  EMA 
2017-02-09 -1.291429 -1.594705 21.83156 

[[25]] 
      KRW.CLOSE KRW.CLOSE.1  EMA 
2017-02-09 -0.8529425 -2.840274 34.61214 

[[26]] 
      MYR.CLOSE MYR.CLOSE.1  EMA 
2017-02-09 0.1407816 -0.4020273 49.80231 

[[27]] 
      SGD.CLOSE SGD.CLOSE.1  EMA 
2017-02-09 0.123548 -0.7103133 49.73621 

[[28]] 
      PHP.CLOSE PHP.CLOSE.1  EMA 
2017-02-09 0.1355443 0.236601 55.61772 

[[29]] 
      THB.CLOSE THB.CLOSE.1  EMA 
2017-02-09 -0.518655 -1.396926 23.51997 

をしかし、私はfor()関数で次のようなものを検索したい:

> for (i in sig) { #Calculates output variables based on active signals 
+  x <- MergedData[[i]] 
+  x <- xts(x[,-1], order.by=x[,1]) 
+  dev20 <- (x[,4]-SMA(x[,4], n=20))/x[,4]*100 
+  dev50 <- (x[,4]-SMA(x[,4], n=50))/x[,4]*100 
+  RSI <- RSI(x[,4], n=14) 
+  print(ret[[i]]<- na.omit(merge(tail(dev20, n=1L), tail(dev50, n=1L), tail(RSI, n=1L)))) 
+ }- (x[,4]-SMA(x[,4], n=50))/x[,4]*100 
     RSI <- RSI(x[,4], n=14) 
     print(ret[[i]]<- na.omit(merge(tail(dev20, n=1L), tail(dev50, n=1L), tail(RSI, n=1L)))) 
     } 

      EUR.LAST EUR.LAST.1  EMA 
2017-02-09 -0.6968559 0.3526983 44.68176 
      GBP.LAST GBP.LAST.1  EMA 
2017-02-09 -0.1920461 1.027927 52.27664 
      CHF.OPEN CHF.OPEN.1  EMA 
2017-02-09 0.5066387 -0.7241689 52.56533 
      PLN.CLOSE PLN.CLOSE.1  EMA 
2017-02-09 0.2824105 -1.569392 48.24069 
      TRY.CLOSE TRY.CLOSE.1  EMA 
2017-02-09 -2.315328 -0.2501765 42.52731 
      ZAR.CLOSE ZAR.CLOSE.1  EMA 
2017-02-09 -0.09598239 -1.492148 46.06286 
      CLP.CLOSE CLP.CLOSE.1  EMA 
2017-02-09 -0.2433194 -2.112368 40.93616 
      MXN.CLOSE MXN.CLOSE.1  EMA 
2017-02-09 -2.460443 -3.490762 34.67792 
      PEN.CLOSE PEN.CLOSE.1  EMA 
2017-02-09 -0.4138617 -1.974541 37.84737 
      CNY.CLOSE CNY.CLOSE.1  EMA 
2017-02-09 -0.08749199 -0.5004658 44.39283 
      IDR.CLOSE IDR.CLOSE.1  EMA 
2017-02-09 -0.4064827 -0.631571 35.91677 
      INR.CLOSE INR.CLOSE.1  EMA 
2017-02-09 -1.291429 -1.594705 21.83156 
      KRW.CLOSE KRW.CLOSE.1  EMA 
2017-02-09 -0.8529425 -2.840274 34.61214 
      MYR.CLOSE MYR.CLOSE.1  EMA 
2017-02-09 0.1407816 -0.4020273 49.80231 
      SGD.CLOSE SGD.CLOSE.1  EMA 
2017-02-09 0.123548 -0.7103133 49.73621 
      PHP.CLOSE PHP.CLOSE.1  EMA 
2017-02-09 0.1355443 0.236601 55.61772 
      THB.CLOSE THB.CLOSE.1  EMA 
2017-02-09 -0.518655 -1.396926 23.51997 

ヒント、提案、およびポインタは非常に高く評価されます!私はfor()関数が理想的でないかもしれないことを理解していますが、sigのインデックスに対応するMergedData値だけを循環させる方法を知っている唯一の方法です。

答えて

0

OK、今すぐ表示されます。あなたは可能性ループのために残しておきたい場合は、変更:

na.omit(print(ret)) 

lapply(ret, function(x) x[!is.na(x)]) 
+0

感謝を生成しますが、何らかの理由で私はまだna.omit(プリント(RET)と同じ結果を得ています) – Nikitau

+0

私は本当に2回目の試みに感謝しています:)しかし、それは私に "エラー '[.xts'(x、!is.na(x))を与えています:' i 'または' j 'が範囲外です。私もna.omit(do.call(ret、merge))を試みましたが、空の行列を返しました。 – Nikitau

+0

hmm ... dgetでデータをロードしようとしましたが、Rが失敗します。あなたはdputのデータをダンプできますか? – kwicher

0

には、データフレームや動物園の時系列を評価するための関数を適用使用してみてください。 Rでは、ret <- as.list(rep(NA, length(MergedData))); ret[[i]]<-rowのような構造を避ける方が良いです。リストを作成するlapply、または行列を与えるapplyを使用してください。

は、この例を考えてみましょう:

library(dplyr) 
library(zoo) 
#create zoo object 
z <- zoo(data.frame(column1 = c(1, 2, 3), column2 = c(5, 6, 7)), order.by = seq(from = as.Date('2017-01-01'), by = 'day', length.out = 3)) 
z 
#create function to calculate each row 
f <- function(row){ 
    row^2 
} 
#apply function f to each row (MARGIN = 1) of zoo (z) object, transpose matrix and create zoo time series 
res<-apply(z,MARGIN = 1,function (row) f(row)) %>% t %>% as.zoo(.,order.by=rownames(.)) 
res 
class(res) 

これは、提案のための

> library(dplyr) 
> library(zoo) 
> #create zoo object 
> z <- zoo(data.frame(column1 = c(1, 2, 3), column2 = c(5, 6, 7)), order.by = seq(from = as.Date('2017-01-01'), by = 'day', length.out = 3)) 
> z 
     column1 column2 
2017-01-01  1  5 
2017-01-02  2  6 
2017-01-03  3  7 
> #create function to calculate each row 
> f <- function(row){ 
+  row^2 
+ } 
> #apply function f to each row (MARGIN = 1) of zoo (z) object, transpose matrix and create zoo time series 
> res<-apply(z,MARGIN = 1,function (row) f(row)) %>% t %>% as.zoo(.,order.by=rownames(.)) 
> res 
     column1 column2 
2017-01-01  1  25 
2017-01-02  4  36 
2017-01-03  9  49 
> class(res) 
[1] "zoo" 
> 
+0

ありがとうございます!私はより良いRのプログラマーになろうとしているので、書道ポインタは大変感謝しています:) ret < - as.list(rep(NA、length(MergedData))))より優先される理由がありますか? ret [[i]] < - r?私はapply関数に慣れていませんが、私はそれを試してみます! for()関数はapply/lapply内に置かれる適切な関数ですか?私は実際には、MergedColumnの特定のインデックスに対して関数を実行したいだけです。 – KeynesCrackpot

+0

'apply'を使用すると、配列インデックスを管理でき、コードが明確で短くなります。通常の配列に由来する多くのミスキーを避けることができます。 'for'ループは内部適用が可能ですが、ベクトル化されたソリューションはよりエレガントです。時間を節約することです。 Rのサイクルではないベクトルを使用してみてください。 – Alexander

+1

これは、dplyrから '%>%'以外のものを使用せず、magrittrからインポートされるので、 'library(dplyr)'を 'library(magrittr)'に置き換えて依存関係を最小限に抑えることができます。 –

関連する問題