R - 检测并总结矩阵中的变化

R - detect and summarize changes in matrices

我有两组矩阵。每个矩阵的维度是 100x100,我有 240 个(假设每个矩阵是在一个月内收集的,我有一个由 240 个月的 100x100 矩阵组成的数据集)。

矩阵中的值介于 1 到 15 之间,代表植被类型(草地、热带森林、苔原等)。

我的第一组矩阵,m1,是我的对照实验。我的第二组矩阵 m2 是一个气候变化实验,气候变化会引起矩阵值的变化。

因此,数据是这样表示的:

m1:一组240个100x100矩阵,每个矩阵对应一个月(因此有240个月的数据)。这是我的控制数据

m2:与m1相同,但由于气候变化,数值有所不同。这是我的实验数据。

这是一些数据:

# generate dataset 1
set.seed(4)
someData1 <- round(runif(100 * 100 * 240, min=1, max=15),digits=0)

# generate dataset2
set.seed(5)
someData2 <- round(runif(100 * 100 * 240, min=1, max=15),digits=0)

# create matrices
k = 240; n=100; m = 100
m1 <- array(someData1, c(n,m,k))
m2 <- array(someData2, c(n,m,k))

我想要做的是以这种方式比较 m2 相对于 m1 的每个单元格:

并对 m2 中的所有 240 个矩阵相对于 m1 中的所有 240 个矩阵执行相同操作。

到最后,我希望能够:

从概念上讲,我需要实现的是这样的:

为了简单起见,我画了 5x5 矩阵而不是 100x100 矩阵。

如何在 R 中实现这一点?

要比较两个矩阵,请使用 ==!=

what.changed <- m1 != m2 # T if changed F if not
changes <- ifelse(what.changed, paste(m1, 'to', m2), NA)
changes # for your little matrices not the 100x100
     [,1]     [,2]      [,3]    
[1,] NA       "7 to 10" "6 to 7"
[2,] NA       NA        NA      
[3,] "3 to 4" "6 to 8"  NA      

你的矩阵看起来相当大,所以我不确定某种稀疏矩阵方法是否更好。关于将更改存储为字符串(“3 到 4”),也许您只能在实际发生更改的地方存储更改,而不是创建一个大部分元素为 NA 的大矩阵。例如

或者您可以创建一个 CSV/dataframe 总结您的更改,例如(使用您的 100x100x240 矩阵演示 3 个坐标):

# find coordinates of changes
change.coords <- which(m1 != m2, arr.ind=T)
colnames(change.coords) <- c('x', 'y', 'time') # whatever makes sense to your application
changes <- data.frame(change.coords, old=m1[change.coords], new=m2[change.coords])
head(changes)
  x y time old new
1 1 1    1   9   4
2 2 1    1   1  11
3 3 1    1   5  14
4 5 1    1  12   2
5 6 1    1   5  11
6 7 1    1  11   8

然后你可以根据需要打印出来,而不必存储大量的字符串 ("X to Y") 和 NA,例如(不要用你的大示例矩阵这样做,有太多的变化它将打印它们 /all/):

with(changes, message(sprintf("Coords (%i, %i, %i): %i to %i\n", 
       x, y, time, old, new)))