我使用此命令从中创建了子集:
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
问题:
vec
与rollapply(vec, width = 1, by = 1, FUN = mean, align
= "left")
相同?which
表示矢量之间存在差异?答案 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
已更新:已修订答案以对应相关修订。