解决方案 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)
。也就是说,在矩阵中,对于第 ira[,,i]
列的每个应用程序都有一行,f
并且该行中的列计算 0、1、...、5 的数量。
另一种可能性是给出与结果列表的组件相同的 5 个矩阵(每个输入列一个):
lapply(dt, rollapply, 3, f)
例如,考虑以下内容。输出的第 1 行表示 f on 的第一个应用dt[,1]
有一个 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
解决方案 2
这表示查看输出的单元格 1,1,其中有一个 0 和两个 1 dt[1:3,1]
。查看输出的第 2,1 单元格,我们看到 1 中有 1 个 0、1 个 1 和 1 个 4 dt[2:4,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"
添加:附加讨论和解决方案2。