我有一个巨大的矩阵,包含从显微细胞图像中提取的各种特征。不同的特性分布在各个列之间,单个单元格分布在矩阵的各个行上。然而,这些测量来自时间推移显微镜,例如每个单个细胞在这个矩阵中有90行(时间点)。因此这个矩阵有维数cell_amount*90;feature_amount。
我的目标是:
我在R中设置了一些代码来测试我的问题,其中我有4个单元格,4个特性(列),每个单元格有3个时间点值。第一个单元格位于第1-3行,第二个单元格位于第4-6行,依此类推。由此,我计算了值的差异:
A <- matrix(sample(1:100, 4*12), ncol = 4)
B <- abs( A - dplyr::lag(A) )
B[seq(1,nrow(B), 3),] <- NA这导致一个矩阵,其中每个单元格的第一行包含NA值:
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] 82 29 54 22
[3,] 32 44 18 31
[4,] NA NA NA NA
[5,] 22 61 10 33
[6,] 19 64 54 35
[7,] NA NA NA NA
[8,] 59 18 6 10
[9,] 34 47 70 6
[10,] NA NA NA NA
[11,] 60 23 68 22
[12,] 17 13 12 9结果矩阵包含每个单元格的这些值的聚合,在本例中是方差,然后如下所示:
[,1] [,2] [,3] [,4]
[1,] 1250 112.5 648 40.5
[2,] 4.5 4.5 968 2
[3,] 312.5 420.5 2048 8
[4,] 924.5 50 1568 84.5如何在R中计算这个新矩阵?任何帮助都是非常感谢的。
发布于 2017-04-12 14:49:07
因为你使用了一个没有种子的随机样本,所以我不能重新创建你的A矩阵。然而,这里是您的B矩阵的重新创建。
B <- matrix(scan(text="
NA NA NA NA
82 29 54 22
32 44 18 31
NA NA NA NA
22 61 10 33
19 64 54 35
NA NA NA NA
59 18 6 10
34 47 70 6
NA NA NA NA
60 23 68 22
17 13 12 9"), ncol=4, byrow=T)如果你真的想要保持这个矩阵,你可以把它重新组合成一个多维数组,然后在边距上应用,得到感兴趣的值,例如
apply(array(B, dim=c(3,4,4)),2:3, var, na.rm=T)
# [,1] [,2] [,3] [,4]
# [1,] 1250.0 112.5 648 40.5
# [2,] 4.5 4.5 968 2.0
# [3,] 312.5 420.5 2048 8.0
# [4,] 924.5 50.0 1568 84.5您还可以创建一个适当的分组变量并使用aggregate()
row_sample <- rep(1:3, each=nrow(B)/3)
aggregate(B, list(row_sample), var, na.rm=T)
# Group.1 V1 V2 V3 V4
# 1 1 1250.0000 112.5000 648.0000 40.50000
# 2 2 496.3333 662.3333 709.3333 193.00000
# 3 3 469.0000 305.3333 1084.0000 72.33333https://stackoverflow.com/questions/43354392
复制相似问题