2012-06-20 37 views
1

首先,如果我的问题的标题不明确,请继续编辑它!在R中的一个大方形矩阵内沿对角线选择较小的方阵矩阵

所以假设我有一个矩形矩阵。

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 

我不知道是否有一个更优雅的方式来做到这一点,可以考虑到主题的数量,因素的数量,以及每个因素内的层数(假设所有因素都相等。级别的数量)

回答

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 

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

+0

非常感谢!这正是我想要完成的! – Alex