我对rollapply的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)运行时会返回错误?除了max替换了print之外,其他所有内容都与上一个示例相同
> 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 54) 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发布于 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,依此类推。
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应用于每一列,然后将结果绑定在一起。否则,所有列都会一次传递给函数。
发布于 2018-03-09 19:02:00
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
https://stackoverflow.com/questions/36141602
复制相似问题