我有两组矩阵。每个矩阵的尺寸为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
中相对于m1
中所有240个矩阵的所有240个矩阵执行相同操作。
最后,我希望能够:
从概念上讲,我需要实现的目标是:
为简单起见,我绘制了5x5矩阵而不是100x100矩阵。
如何在R?
中实现这一目标答案 0 :(得分:3)
要比较两个矩阵,请使用==
或!=
。
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
你的矩阵看起来相当大,所以我不确定某种稀疏矩阵方法是否会更好。关于将更改存储为字符串(&#34; 3到4&#34;),也许您只能在实际存在更改的地方存储更改,而不是创建大多数元素为{的大型矩阵。 {1}}。 e.g。
或许您可以创建一个汇总更改的CSV /数据框,例如: (使用100x100x240矩阵来演示3个坐标):
NA
然后你可以按照自己的意愿打印出来,而不必存储大量的字符串(&#34; X到Y&#34;)和NA,例如(不要用你的大样本矩阵,那里是太多的变化,它会打印/全部/):
# 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