我想在矩阵上应用滚动窗口模式更新。假设我有一个零的矩阵和类似的矩阵:
mat <- matrix(c(0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0),nrow=4)
0 1 1 1
1 1 1 0
1 0 1 0
0 0 0 0
我想一次扫描矩阵2值的每一行,并根据这组规则创建一个标签矩阵:
0 0 - then label as A
0 1 - then label as B
1 0 - then label as B
1 1 - then label as C
上述矩阵的所需输出为:
(显示NA
值,因为第一个值之前没有值)
NA B C C
NA C C B
NA B B B
NA A A A
我正在尝试在R
中实现此功能。有没有办法使用其中一种应用方法?或者是否有快速方法将此数据存储为data.frame并使用dplyr
或data.table
等包进行处理?目前,我正在将其作为for
循环处理(当然,这非常非常慢)。
答案 0 :(得分:6)
此处的滚动操作对成对组合起作用,因此您只需定义函数:
f <- function(x,y) LETTERS[1:3][x+y+1L]
然后将其应用于适当的对:
nc <- ncol(m)
res <- matrix(,length(m)/nc,nc)
res[,-1] <- f(m[,-nc], m[,-1])
# [,1] [,2] [,3] [,4]
# [1,] NA "B" "C" "C"
# [2,] NA "C" "C" "B"
# [3,] NA "B" "B" "B"
# [4,] NA "A" "A" "A"