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 に答える