【问题标题】:several questions regarding zoo::rollapply关于 zoo::rollapply 的几个问题
【发布时间】:2023-03-14 09:52:01
【问题描述】:

我对@9​​87654321@的width选项的理解是它指定了函数将在其上运行的窗口大小,by选项指定了这个窗口的移位大小。这是我的数据集:

> 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) 工作时返回错误?除了printmax 替换之外,一切都与上一个示例相同:

> 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 变量?

> 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

【问题讨论】:

  • 您应该尝试将您的帖子限制为每个问题,例如,因为我可以为您的一些但不是所有问题提供一些提示:1)不确定,但有趣的是 min 没有错误; 2)可变窗口; 3) 不确定; 4)???; 5)最后一个例子是给你行最大值,窗口为 2,所以用最小值或中值再试一次,看看会发生什么
  • @rawr 谢谢你的回复。您能否尝试进一步解释 2,4(更正前为 5)作为答案?谢谢。

标签: r rollapply


【解决方案1】:

(1) 可能是一个错误。

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

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

所以对于第一个w12c(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 在一起。否则所有列都会立即传递给函数。

【讨论】:

  • 我已经阅读了几次帮助,但我不是以英语为母语的人,所以我没有抓住 2、3、4 的重点(在更正之前是 5)。您可以尝试解释它而不是引用帮助吗?谢谢。
  • 添加了一些说明。请注意,帮助文件的末尾有很多示例,我建议您仔细阅读它们,因为其中大部分内容不仅解释了,而且还通过示例进行了说明。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 2020-11-29
    • 2011-05-12
    • 2011-08-24
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多