3

n 期間に基づく一連の移動平均を持つ xts オブジェクトがあります。

              3     5       8    10
2012-11-16 1.573333 1.598 1.61500 1.631
2012-11-19 1.543333 1.576 1.60125 1.617
2012-11-20 1.546667 1.562 1.58750 1.601
2012-11-21 1.523333 1.530 1.57000 1.583

以下のように整形したいと思います。

              ma     n
2012-11-16 1.573333  3
2012-11-16 1.598     5
2012-11-16 1.61500   8
2012-11-16 1.631     10
2012-11-19 1.543333  3
2012-11-19 1.576     5
2012-11-19 1.60125   8
2012-11-19 1.617     10
2012-11-20 1.546667  3
2012-11-20 1.562     5
2012-11-20 1.58750   8
2012-11-20 1.601     10
2012-11-21 1.523333  3
2012-11-21 1.530     5
2012-11-21 1.57000   8
2012-11-21 1.583     10

現在、私は for ループを使用していますが、これは R では十分に効率的ではないと思います。

> sma1
              3     5       8    10
2012-11-16 1.573333 1.598 1.61500 1.631
2012-11-19 1.543333 1.576 1.60125 1.617
2012-11-20 1.546667 1.562 1.58750 1.601
2012-11-21 1.523333 1.530 1.57000 1.583
>
> n <- c(3,5,8,10)
> count <- 0
> for(i in n) { 
+     tempsma <- cbind(rbind(sma1[,paste(i,sep="")]),paste(i,sep=""))
+     if (count == 0) {
+         sma2 <- tempsma 
+         count <- 1
+     } else {
+         sma2 <- rbind(sma2,tempsma)
+     }
+ }
> names(sma2) <- c("ma","n")
> sma2
                 ma  n
2012-11-16 1.573333  3
2012-11-16 1.598000  5
2012-11-16 1.615000  8
2012-11-16 1.631000 10
2012-11-19 1.543333  3
2012-11-19 1.576000  5
2012-11-19 1.601250  8
2012-11-19 1.617000 10
2012-11-20 1.546667  3
2012-11-20 1.562000  5
2012-11-20 1.587500  8
2012-11-20 1.601000 10
2012-11-21 1.523333  3
2012-11-21 1.530000  5
2012-11-21 1.570000  8
2012-11-21 1.583000 10

R の for ループはコストがかかるため、同じタスクを実行するためのより効率的な方法があるかどうか疑問に思っています。

ありがとう!

4

3 に答える 3

4

ここでは、 を使用したソリューションを示しstackます。

まず、サンプル データを作成します。

> dat <- xts(data.frame(matrix(1:8,ncol=4)),Sys.time()+1:2)
> dat
                    X1 X2 X3 X4
2013-02-28 00:17:25  1  3  5  7
2013-02-28 00:17:26  2  4  6  8

次に、次を使用して長い形式にしstackます。

> data.frame(index(dat),stack(as.data.frame(coredata(dat))))
           index.dat. values ind
1 2013-02-28 00:17:25      1  X1
2 2013-02-28 00:17:26      2  X1
3 2013-02-28 00:17:25      3  X2
4 2013-02-28 00:17:26      4  X2
5 2013-02-28 00:17:25      5  X3
6 2013-02-28 00:17:26      6  X3
7 2013-02-28 00:17:25      7  X4
8 2013-02-28 00:17:26      8  X4
于 2013-02-27T23:19:04.420 に答える
2

データをデータ フレームに変換しても問題ない場合は、パッケージのmelt関数を使用できます。reshape2データは簡単に再現できないため、最初にサンプルデータを使用します。

library(xts)
data(sample_matrix)
sample.xts <- head(as.xts(sample_matrix),5)
sample.xts
#                Open     High      Low    Close
# 2007-01-02 50.03978 50.11778 49.95041 50.11778
# 2007-01-03 50.23050 50.42188 50.23050 50.39767
# 2007-01-04 50.42096 50.42096 50.26414 50.33236
# 2007-01-05 50.37347 50.37347 50.22103 50.33459
# 2007-01-06 50.24433 50.24433 50.11121 50.18112

次に、次のことができます。

df <- data.frame(sample.xts)
df$id <- rownames(df)
melt(df, measure.vars=c("Open", "High","Low","Close"))

与える:

           id variable    value
1  2007-01-02     Open 50.03978
2  2007-01-03     Open 50.23050
3  2007-01-04     Open 50.42096
4  2007-01-05     Open 50.37347
5  2007-01-06     Open 50.24433
6  2007-01-02     High 50.11778
7  2007-01-03     High 50.42188
8  2007-01-04     High 50.42096
9  2007-01-05     High 50.37347
10 2007-01-06     High 50.24433
11 2007-01-02      Low 49.95041
12 2007-01-03      Low 50.23050
13 2007-01-04      Low 50.26414
14 2007-01-05      Low 50.22103
15 2007-01-06      Low 50.11121
16 2007-01-02    Close 50.11778
17 2007-01-03    Close 50.39767
18 2007-01-04    Close 50.33236
19 2007-01-05    Close 50.33459
20 2007-01-06    Close 50.18112
于 2013-02-27T22:05:48.867 に答える
0
> xts = read.csv("xts.csv",header=F)
> xts
          V1       V2    V3      V4    V5
1 11/16/2012 1.573333 1.598 1.61500 1.631
2 11/19/2012 1.543333 1.576 1.60125 1.617
3 11/20/2012 1.546667 1.562 1.58750 1.601
4 11/21/2012 1.523333 1.530 1.57000 1.583
> 
> col1 = rep(xts[,1],each=nrow(xts))
> n = rep(c(3,5,8,10),times=nrow(xts))
> sma1 = c()
> 
> for(i in 1:nrow(xts)){
+ sma1 = rbind(sma1,t(xts[i,-1]))
+ }
> 
> sma2 = data.frame(col1,sma1,n)
> sma2
         col1       X1  n
1  11/16/2012 1.573333  3
2  11/16/2012 1.598000  5
3  11/16/2012 1.615000  8
4  11/16/2012 1.631000 10
5  11/19/2012 1.543333  3
6  11/19/2012 1.576000  5
7  11/19/2012 1.601250  8
8  11/19/2012 1.617000 10
9  11/20/2012 1.546667  3
10 11/20/2012 1.562000  5
11 11/20/2012 1.587500  8
12 11/20/2012 1.601000 10
13 11/21/2012 1.523333  3
14 11/21/2012 1.530000  5
15 11/21/2012 1.570000  8
16 11/21/2012 1.583000 10
于 2013-02-27T22:23:46.427 に答える