在R中的大方矩阵内沿对角线选择较小的方形矩阵

时间:2012-06-20 16:25:21

标签: r matrix outer-join

首先,如果我的问题标题不清楚,请继续编辑!

假设我有一个方阵。

ex = outer(1:4, 2:5, "+")
colnames(ex) = paste(rep(c("Subj1", "Subj2"), each=2), "_", 
               rep("Factor1", each=2), ".", rep(c("A", "B")), sep="")
rownames(ex) = paste(rep(c("Subj1", "Subj2"), each=2), "_", 
               rep("Factor2", each=2), ".", rep(c("A", "B")), sep="")

矩阵: enter image description here

我想在红色框中提取值,这些值基本上是每个主题中不同因子水平组合的值(但不是跨不同主题),并将它们保存到以下序列中的向量中:

[1] 3, 4, 4, 5, 7, 8, 8, 9

我当然可以使用如下所示的循环:

v = NULL
for(i in 1:16){if(ex2[i,2] == ex2[i,3]) v[i] = ex2[i,1]}
v = v[!is.na(v)]
v
[1] 3 4 4 5 7 8 8 9

我想知道是否有一种更优雅的方法可以考虑到受试者的数量,因素的数量,以及每个因素中的水平数量(假设所有因素的数量相等)等级。)

1 个答案:

答案 0 :(得分:2)

要在红色框中提取子矩阵,您只需执行以下操作:

ex[1:2, 1:2]

ex[3:4, 3:4]

要将它们转换为您想要的单个矢量,只需执行以下操作:

c(ex[1:2, 1:2], ex[3:4, 3:4])
# [1] 3 4 4 5 7 8 8 9

ETA:用更一般的术语回答你的问题:让我们说我们预先设置了主题和级别的数量(增加因素的数量更复杂,除非我弄错了,因为那时它将不再是一个二维矩阵。)

num.subjects = 2
num.levels = 2
size = num.subjects * num.levels
ex = outer(1:size, (1:size)+1, "+")

我们可以得到这样的解决方案:

subjects = rep(1:num.subjects, each=num.levels)
v = c(sapply(1:num.subjects, function(s) ex[subjects == s, subjects == s]))

v现在

 [1] 3 4 4 5 7 8 8 9

这可以扩展到更多的主题和级别。将主题设置为3,将级别设置为4:

 [1]  3  4  5  6  4  5  6  7  5  6  7  8  6  7  8  9 11 12 13 14 12 13 14 15 13
[26] 14 15 16 14 15 16 17 19 20 21 22 20 21 22 23 21 22 23 24 22 23 24 25

要提供更多解释:创建每个单独子矩阵的列表可以非常简单地完成:

matrices = lapply(1:num.subjects, function(s) ex[subjects == s, subjects == s])

matrices现在是:

[[1]]
     [,1] [,2]
[1,]    3    4
[2,]    4    5

[[2]]
     [,1] [,2]
[1,]    7    8
[2,]    8    9

对于矢量版本,您必须单独连接每个,然后整体连接。这实际上就是上述解决方案的作用。