1

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

所以假设我有一个方阵。

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="")

矩阵: 在此处输入图像描述

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

[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

我想知道是否有更优雅的方法来做到这一点,可以考虑到受试者的数量、因素的数量以及每个因素中的级别数(假设所有因素都有相同的级别数。)

4

1 回答 1

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

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

于 2012-06-20T16:27:17.850 回答