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

或者您可以rollapplyzoo包中使用:

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')

关于你的第二个问题,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 回答