首先,如果我的问题标题不清楚,请继续编辑!
假设我有一个方阵。
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
我想知道是否有一种更优雅的方法可以考虑到受试者的数量,因素的数量,以及每个因素中的水平数量(假设所有因素的数量相等)等级。)
答案 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
对于矢量版本,您必须单独连接每个,然后整体连接。这实际上就是上述解决方案的作用。