2

必要なものに正確に一致するものが見つからなかったので、これを投稿すると思いました。基本的に、関数を使用して変数のローリング インデックスに依存する多くの関数があり、元のデータフレームに自然に戻る必要があります。

例えば、

data<-as.data.frame(as.matrix(seq(1:30)))
data$V1<-data$V1/100
str(data)

data$V1<-NA  # rolling 5 day product
for (i in 5:nrow(data)){
  start<-i-5
  end<-i
  data$V1_MA5d[i]<- (prod(((data$V1[start:end]/100)+1))-1)*100
}
data
> head(data,15)
     V1   V1_MA5d
1  0.01        NA
2  0.02        NA
3  0.03        NA
4  0.04        NA
5  0.05 0.1500850
6  0.06 0.2101751
7  0.07 0.2702952
8  0.08 0.3304453
9  0.09 0.3906255
10 0.10 0.4508358
11 0.11 0.5110762
12 0.12 0.5713467
13 0.13 0.6316473
14 0.14 0.6919780
15 0.15 0.7523389

しかし、実際には、次のようなことができるはずです。

data$V1_MA5d<-sapply(data$V1, function(x) prod(((data$V1[i-5:i]/100)+1))-1)*100

しかし、それがどのように見えるかはわかりません。

同様に、別の変数による変数のカウント:

data$V1_MA5_cat<-NA
data$V1_MA5_cat[data$V1_MA5d<.5]<-0
data$V1_MA5_cat[data$V1_MA5d>.5]<-1
data$V1_MA5_cat[data$V1_MA5d>1.5]<-2
table(data$V1_MA5_cat)

data$V1_MA5_cat_n<-NA
data$V1_MA5_cat_n[data$V1_MA5_cat==0]<-nrow(subset(data,V1_MA5_cat==0))
data$V1_MA5_cat_n[data$V1_MA5_cat==1]<-nrow(subset(data,V1_MA5_cat==1))
data$V1_MA5_cat_n[data$V1_MA5_cat==2]<-nrow(subset(data,V1_MA5_cat==2))

> head(data,15)
     V1   V1_MA5d V1_MA5_cat V1_MA5_cat_n
1  0.01        NA         NA           NA
2  0.02        NA         NA           NA
3  0.03        NA         NA           NA
4  0.04        NA         NA           NA
5  0.05 0.1500850          0            6
6  0.06 0.2101751          0            6
7  0.07 0.2702952          0            6
8  0.08 0.3304453          0            6
9  0.09 0.3906255          0            6
10 0.10 0.4508358          0            6
11 0.11 0.5110762          1           17
12 0.12 0.5713467          1           17
13 0.13 0.6316473          1           17
14 0.14 0.6919780          1           17
15 0.15 0.7523389          1           17

私はもっ​​と良い方法があることを知っています - 助けて!

4

1 に答える 1

3

これは、いくつかの方法のいずれかで実行できます。ここで、R で「正しい」 for ループを記述したことに言及する価値がありますdata$V1_MA5d <- NA。このようにして、成長するのではなく満たすことができ、実際にはかなり効率的です。applyただし、ファミリを使用する場合:

sapply(5:nrow(data), function(i) (prod(data$V1[(i-5):i]/100 + 1)-1)*100)

[1] 0.1500850 0.2101751 0.2702952 0.3304453 0.3906255 0.4508358 0.5110762 0.5713467 0.6316473 0.6919780 0.7523389 0.8127299
[13] 0.8731511 0.9336024 0.9940839 1.0545957 1.1151376 1.1757098 1.2363122 1.2969448 1.3576077 1.4183009 1.4790244 1.5397781
[25] 1.6005622 1.6613766

内の私のコードが[]あなたのものと異なることに注意してください。違いをチェックしてください:

i <- 10
i - 5:i
(i-5):i

または、パッケージrollapplyから使用できます。zoo

library(zoo)
myfun  <- function(x) (prod(x/100 + 1)-1)*100
rollapply(data$V1, 5, myfun)

[1] 0.1500850 0.2001551 0.2502451 0.3003552 0.3504853 0.4006355 0.4508057 0.5009960 0.5512063 0.6014367 0.6516872 0.7019577
[13] 0.7522484 0.8025591 0.8528899 0.9032408 0.9536118 1.0040030 1.0544142 1.1048456 1.1552971 1.2057688 1.2562606 1.3067726
[25] 1.3573047 1.4078569

コメントによると、これにより長さ 26 のベクトルが得られます...代わりに、いくつかの引数を追加rollapplyして、初期データと一致させることができます。

rollapply(data$V1, 5, myfun, fill=NA, align='right')

2番目の質問に関しては、plyrここで便利です。

library(plyr)
data$cuts <- cut(data$V1_MA5d, breaks=c(-Inf, 0.5, 1.5, Inf))
ddply(data, .(cuts), transform, V1_MA5_cat_n=length(cuts))

しかし、他にも多くの選択肢があります。

于 2012-08-29T20:16:02.057 に答える