1

我对rollapply's widthoption 的理解是它指定了函数将在其上运行的窗口大小,而byoptions 指定了这个窗口的移位大小。这是我的数据集:

> dataset <- as.vector(t(cbind(5:1, 1:5)))
> dataset
 [1] 5 1 4 2 3 3 2 4 1 5

以下是证实我在上面写过的示例:

> 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)?一切都与上一个示例相同,除了print替换为max

> 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) 在选项中使用大于 1 的向量的目的是什么?with为什么下面的代码在奇数位置打印一个数字输出,但将奇数位置的两个数字分配给w12变量?

> 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(与以前的输出相比,这是完全不同的)?

> 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什么?我期待它与矩阵有关,所以我尝试了以下操作:

> 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
4

2 回答 2

0

(1) 可能是一个错误。

(2)和(3)在帮助文件中有解释:

如果 width 是一个普通的数字向量,它的元素被认为是宽度,与 align 一起被解释,而如果 width 是一个列表,它的组件被认为是偏移量。在上述情况下,如果宽度的长度为 1,则宽度会为每个点循环。如果 width 是一个列表,它的组件表示整数偏移量,因此列表的第 i 个组件指的是位置 i + width[[i]] 处的时间点。如果这些点中的任何一个低于 1 或高于 index(data) 的长度,则不会针对该点评估 FUN,除非 partial = TRUE 并且在这种情况下仅通过有效点。

所以对于第一个w12,指定的宽度c(1, 2)被回收到长度,dataset以便备用应用程序的宽度为 1 和 2。

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

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默认情况下它应用于每一列,然后将结果 cbind'ed 在一起。否则,所有列都会立即传递给函数。

于 2016-03-21T21:53:29.437 回答
0

1 也在工作:

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

rollapply(dataset, width = 2, by=1, FUN = max, align="left")

[1] 5 4 4 3 3 3 4 4 5

于 2018-03-09T11:01:59.953 回答