rollapply与函数rle(x)

时间:2014-01-24 06:35:44

标签: r data.table zoo rollapply

我有时间序列数据作为data.table类,每列(观察点)都有我想在滑动窗口(30宽度)内计算它们的值。 我尝试使用rle(sort(x))来计算rollapply中的每个值,但它不起作用。

例如,如果我有如下表格,

dt <- data.frame(v1=c(1,0,1,4,4,4,4,4),v2=c(1,1,1,4,3,3,3,3),
          v3=c(0,1,1,3,3,3,3,2),v4=c(1,1,0,3,3,3,3,3),
       v5=c(1,1,1,5,5,5,5,5))

我试过这样;

rollapply(dt, 3, function(x) {rle(sort(x))$values; rle(sort(x))$length})

但结果却没有意义。 请给我一些方向......

1 个答案:

答案 0 :(得分:3)

解决方案1 ​​假设目标是获得3个值的滚动计数,请尝试以下操作:

m <- as.matrix(dt)
levs <- sort(unique(c(m)))
f <- function(x) table(factor(x, levs))
r <- rollapply(m, 3, f)

这里levs是0,1,...,5因此,对于函数的每个应用程序,我们将得到一个向量6,其长度为0,1,...,5的计数。有5个输入列,因此将这样的函数应用于每列可得到5 * 6 = 30列输出。

请注意rollapply适用于矩阵或动物园对象,而不是数据框,因此我们对其进行了转换。另外,为了确保每个函数应用程序输出相同长度的向量,我们将每个输入转换为具有相同级别的因子。

请注意:

ra <- array(r, c(6, 6, 5))

给出一个3d数组,其中ra [,, i]是由rollapply(dt[, i], 3, f)形成的矩阵。也就是说,在矩阵ra[,,i]中,第i列的f的每个应用都有一行,该行中的列计算0,1,...,5的数量。

另一种可能性就是给出相同的5个矩阵(每个输入列一个)作为结果列表的组成部分:

lapply(dt, rollapply, 3, f)

例如,请考虑以下内容。输出的第1行表示dt[,1]上f的第一个应用有一个0,两个1,没有其他值。这也可以从r[,,1]或从lapply(dt, rollapply, 3, f)[[1]]获得 > rollapply(dt[, 1], 3, f) 0 1 2 3 4 5 [1,] 1 2 0 0 0 0 <- dt[1:3,1] has 1 zero and 2 ones [2,] 1 1 0 0 1 0 <- dt[2:4,1] has 1 zero and 1 one and 1 four, etc. [3,] 0 1 0 0 2 0 [4,] 0 0 0 0 3 0 [5,] 0 0 0 0 3 0 [6,] 0 0 0 0 3 0

dt[1:3,1]

解决方案2

这说看输出的单元格1,1在dt[2:4,1]中有一个0和两个1。查看输出的单元格2,1我们看到> g <- function(x) { tab <- table(x); toString(paste(names(tab), tab, sep = ":")) } > sapply(dt, rollapply, 3, g) # or rollapply(m, 3, g) where m was defined in solution 1 v1 v2 v3 v4 v5 [1,] "0:1, 1:2" "1:3" "0:1, 1:2" "0:1, 1:2" "1:3" [2,] "0:1, 1:1, 4:1" "1:2, 4:1" "1:2, 3:1" "0:1, 1:1, 3:1" "1:2, 5:1" [3,] "1:1, 4:2" "1:1, 3:1, 4:1" "1:1, 3:2" "0:1, 3:2" "1:1, 5:2" [4,] "4:3" "3:2, 4:1" "3:3" "3:3" "5:3" [5,] "4:3" "3:3" "3:3" "3:3" "5:3" [6,] "4:3" "3:3" "2:1, 3:2" "3:3" "5:3" 中有一个0,1个1和1个等等。

{{1}}

增加:补充讨论和解决方案2.