首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于zoo::rollapply的几个问题

关于zoo::rollapply的几个问题
EN

Stack Overflow用户
提问于 2016-03-22 05:06:39
回答 2查看 1.5K关注 0票数 1

我对rollapplywidth选项的理解是,它指定函数将在其上操作的窗口大小,而by选项指定此窗口的移位大小。

代码语言:javascript
复制
> dataset <- as.vector(t(cbind(5:1, 1:5)))
> dataset
 [1] 5 1 4 2 3 3 2 4 1 5

下面的例子证实了我在上面写的:

代码语言:javascript
复制
> w3b3 <- rollapply(dataset, width = 3, by=3, FUN = print, align="left")
[1] 5 1 4
[1] 2 3 3
[1] 2 4 1

> w3b2 <- rollapply(dataset, width = 3, by=2, FUN = print, align="left")
[1] 5 1 4
[1] 4 2 3
[1] 3 3 2
[1] 2 4 1

> w2b3 <- rollapply(dataset, width = 2, by=3, FUN = print, align="left")
[1] 5 1
[1] 2 3
[1] 2 4

> w3b1 <- rollapply(dataset, width = 3, by=1, FUN = print, align="left")
[1] 5 1 4
[1] 1 4 2
[1] 4 2 3
[1] 2 3 3
[1] 3 3 2
[1] 3 2 4
[1] 2 4 1
[1] 4 1 5

# ACCORDING OT MAN WHEN NO VALUE IS USED THEN by=1 (SAME AS ABOVE)
> w3b1 <- rollapply(dataset, width = 3, FUN = print, align="left")
[1] 5 1 4
[1] 1 4 2
[1] 4 2 3
[1] 2 3 3
[1] 3 3 2
[1] 3 2 4
[1] 2 4 1
[1] 4 1 5

> w1b1 <- rollapply(dataset, width = 1, by=1, FUN = print, align="left")
[1] 5
[1] 1
[1] 4
[1] 2
[1] 3
[1] 3
[1] 2
[1] 4
[1] 1
[1] 5

尽管如此,我还是有几个问题:

1)为什么这个在max(20)运行时会返回错误?除了max替换了print之外,其他所有内容都与上一个示例相同

代码语言:javascript
复制
> w1b1 <- rollapply(dataset, width = 1, by=1, FUN = max, align="left")
Error in if (is.na(a) || is.na(rval[i = 1]) || a == rval[i - 1]) max(xc[(i -  : 
  missing value where TRUE/FALSE needed

如何调试那些类型的*apply系列函数错误?

2)在with选项中使用大于1的向量的目的是什么,为什么下面的代码将一个数字打印到奇数位置输出,而将两个奇数位置的数字赋给w12变量?

代码语言:javascript
复制
> w12 <- rollapply(dataset, width = c(1,2), FUN = print, align="left")
[1] 5
[1] 1 4
[1] 4
[1] 2 3
[1] 3
[1] 3 2
[1] 2
[1] 4 1
[1] 1
> w12
      [,1] [,2]
 [1,]    5    5
 [2,]    1    4
 [3,]    4    4
 [4,]    2    3
 [5,]    3    3
 [6,]    3    2
 [7,]    2    2
 [8,]    4    1
 [9,]    1    1

# SAME AS ABOVE (ACCORDING TO MAN by IS USED ONLY IF width IS OF LENGTH 1)
> w12 <- rollapply(dataset, width = c(1,2), by=10, FUN = print, align="left")
[1] 5
[1] 1 4
[1] 4
[1] 2 3
[1] 3
[1] 3 2
[1] 2
[1] 4 1
[1] 1
> w12
      [,1] [,2]
 [1,]    5    5
 [2,]    1    4
 [3,]    4    4
 [4,]    2    3
 [5,]    3    3
 [6,]    3    2
 [7,]    2    2
 [8,]    4    1
 [9,]    1    1 

3)将向量和列表传递给width参数有什么不同(与之前的输出完全不同)?

代码语言:javascript
复制
> rollapply(dataset, width = list(1,2), FUN = print, align="left")
[1] 1
[1] 2
[1] 2
[1] 3
[1] 3
[1] 4
[1] 4
[1] 5
[1] 5
[1] 1 2 2 3 3 4 4 5 5

4) by.column做什么?我认为它与矩阵有关,所以我尝试了以下内容:

代码语言:javascript
复制
> mtrx <- matrix(c(1:30), nrow=10)
> mtrx
      [,1] [,2] [,3]
 [1,]    1   11   21
 [2,]    2   12   22
 [3,]    3   13   23
 [4,]    4   14   24
 [5,]    5   15   25
 [6,]    6   16   26
 [7,]    7   17   27
 [8,]    8   18   28
 [9,]    9   19   29
[10,]   10   20   30

# THIS IS OK
> rollapply(mtrx, width = 2, by = 2, FUN = max, align = "left", by.column=T)
     [,1] [,2] [,3]
[1,]    2   12   22
[2,]    4   14   24
[3,]    6   16   26
[4,]    8   18   28
[5,]   10   20   30

# BUT WHAT IS THIS?
> rollapply(mtrx, width = 2, by = 2, FUN = max, align = "left", by.column=F)
[1] 22 24 26 28 30
EN

回答 2

Stack Overflow用户

发布于 2016-03-22 05:53:29

(1)很可能是一个bug。

(2)和(3)在帮助文件中进行了解释:

如果width是一个普通的数字向量,那么它的元素将被视为宽度,并与align一起解释,而如果width是一个列表,则其组成部分将被视为偏移量。在上面的例子中,如果宽度的长度是1,那么每隔一个点的宽度就会被回收。如果width是一个列表,则其组件表示整数偏移量,使得列表的第i个组件引用位置i+ width[i]处的时间点。如果这些点中的任何一个小于或大于索引(Data)的长度,则不会为该点计算FUN,除非partial = TRUE,在这种情况下只传递有效的点。

因此,对于第一个w12,指定的c(1, 2)宽度被循环使用到dataset的长度,以便备用应用程序的宽度为1和2。

因此,第一个w12与下面的相同,它先使用宽度1,然后使用宽度2,然后使用1,依此类推。

代码语言:javascript
复制
rollapply(dataset, c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2), print)

如果为width指定了列表,则其组件将被视为偏移量而不是宽度。1表示下一个值,2表示下一个值之后的值,-1表示先前值,依此类推。

对于列表示例,它被回收为list(1, 2, 1, 2, 1, 2, 1, 2, 1, 2),因此对于第一个应用程序,它使用下一个值,对于第二个应用程序,它使用下一个值之后的值,对于第三个应用程序,它再次使用下一个值,依此类推。

(4) by.column在帮助文件中定义:

by.column -逻辑。如果为TRUE,则将FUN单独应用于每一列。

缺省值为TRUE,因此缺省情况下将rollapply应用于每一列,然后将结果绑定在一起。否则,所有列都会一次传递给函数。

票数 0
EN

Stack Overflow用户

发布于 2018-03-09 19:02:00

1也在工作:

代码语言:javascript
复制
dataset <- as.vector(t(cbind(5:1, 1:5)))
rollapply(dataset, width = 1, by=1, FUN = max, align="left")

1 5 1 4 2 3 3 2 4 1 5

宽度为2

代码语言:javascript
复制
rollapply(dataset, width = 2, by=1, FUN = max, align="left")

1 5 4 4 3 3 3 4 4 5

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36141602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档