是`vec`与`rollapply相同(vec,width = 1,by = 1,FUN = mean,align =" left")`?

时间:2016-02-02 23:03:07

标签: r

我使用此命令从中创建了子集:

sub.as = as[seq(70,100)]

子集如下:

> is.vector(sub.as)
[1] TRUE

> str(sub.as)
 num [1:31] 1 0.75 0.9 0.475 0.925 0.975 1 1 0.525 1 ...

> sub.as
 [1] 1.000 0.750 0.900 0.475 0.925 0.975 1.000 1.000 0.525 1.000 0.200 0.200
[13] 0.200 0.200 0.150 0.150 0.150 0.150 0.150 0.450 0.875 0.175 0.150 0.150
[25] 0.150 0.100 0.100 0.100 0.100 0.350 1.000

我已按照以下方式将rollapply应用于此向量:

> sub.as.avg.1 = rollapply(sub.as, width = 1,  by = 1,  FUN = mean, align = "left")

基于this回答,我比较了两个向量。输出长度相同:

> length(sub.as)
[1] 31

> length(sub.as.avg.1)
[1] 31

这些索引的值应该不同:

> which(sub.as != sub.as.avg.1)
 [1] 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29

应该有所不同的值(但正如你所看到的那样):

> sub.as[which(sub.as != sub.as.avg.1)]
 [1] 0.200 0.200 0.200 0.200 0.150 0.150 0.150 0.150 0.150 0.450 0.175 0.150
[13] 0.150 0.150 0.100 0.100 0.100 0.100

> sub.as.avg.1[which(sub.as != sub.as.avg.1)]
 [1] 0.200 0.200 0.200 0.200 0.150 0.150 0.150 0.150 0.150 0.450 0.175 0.150
[13] 0.150 0.150 0.100 0.100 0.100 0.100

问题:

  1. vecrollapply(vec, width = 1, by = 1, FUN = mean, align = "left")相同?
  2. 为什么which表示矢量之间存在差异?

1 个答案:

答案 0 :(得分:2)

请注意以下两个rollapply代码之间的差异。第一个使用mean,第二个使用(mean)。如果rollapply感觉到代码试图采取手段,那么它使用更快的算法并且涉及计算,这可能导致小的数字差异。 [在离线讨论中,Achim指出,即使使用width = 1,这种优化也会更快。)另一方面,如果使用(mean),则会失败,因为它会尝试识别需要的方法并且优化是没有应用,因此没有数字差异(虽然它会更慢)。

library(zoo)

sub.as <- c(1, 0.75, 0.9, 0.475, 0.925, 0.975, 1, 1, 0.525, 1, 0.2, 0.2, 
 0.2, 0.2, 0.15, 0.15, 0.15, 0.15, 0.15, 0.45, 0.875, 0.175, 0.15, 
 0.15, 0.15, 0.1, 0.1, 0.1, 0.1, 0.35, 1)

第一

# 1
r1 <- rollapply(sub.as, width = 1,  by = 1, FUN = mean, align = "left")
sub.as - r1
##  [1]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
##  [6]  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00  0.000000e+00
## [11]  5.551115e-17  5.551115e-17  5.551115e-17  5.551115e-17  5.551115e-17
## [16]  5.551115e-17  5.551115e-17  5.551115e-17  5.551115e-17  5.551115e-17
## [21]  0.000000e+00 -2.775558e-17 -2.775558e-17 -2.775558e-17 -2.775558e-17
## [26] -2.775558e-17 -2.775558e-17 -2.775558e-17 -2.775558e-17  0.000000e+00
## [31]  0.000000e+00

第二

# 2
r2 <- rollapply(sub.as, width = 1, by = 1, FUN = (mean), align = "left")
identical(sub.as, r2)
## [1] TRUE

已更新:已修订答案以对应相关修订。