13

私はRの行列が好きで、次のように取得したいと思います。

Max off - diagonal elements
Min off – diagonal elements
Mean off –diagonal elements

対角では、max(diag(A))、min(diag(A))、mean(diag(A))を使用し、問題なく動作しました

しかし、非対角線のために私は試しました

dataD <- subset(A, V1!=V2)

Error in subset.matrix(A, V1 != V2) : object 'V1' not found

使用する:

colMeans(dataD) # get the mean for columns

しかし、dataD b / cを取得できません。オブジェクト「V1」が見つからないと表示されますが、

ありがとう!

4

6 に答える 6

28

ここでは、ヘルパー関数row()col()ヘルパー関数が役立ちます。@JamesAを使用すると、この小さなトリックを使用して上の非対角線を取得できます。

> A[row(A) == (col(A) - 1)]
[1]  5 10 15

そして、これを介して対角線の下側:

> A[row(A) == (col(A) + 1)]
[1]  2  7 12

これらを一般化して、必要な対角線を与えることができます。

> A[row(A) == (col(A) - 2)]
[1]  9 14

サブセット化は必要ありません。

次に、これらの値に対して必要な関数を呼び出すのは簡単なことです。例えば:

> mean(A[row(A) == (col(A) - 1)])
[1] 10

私のコメントによると、対角線以外のすべてを意味する場合は、使用します

> diag(A) <- NA
> mean(A, na.rm = TRUE)
[1] 8.5
> max(A, na.rm = TRUE)
[1] 15
> # etc. using sum(A, na.rm = TRUE), min(A, na.rm = TRUE), etc..

したがって、これが失われることはありません。Ben Bolker は、(コメントで) 上記のコード ブロックを、上記のrow()andcol()関数を使用してより適切に実行できることを示唆しています。

mean(A[row(A)!=col(A)])
min(A[row(A)!=col(A)])
max(A[row(A)!=col(A)])
sum(A[row(A)!=col(A)])

これは、全体的に優れたソリューションです。

于 2012-10-24T13:02:06.600 に答える
7

単純な 1 行のコードで:

行列 A について、最小値、第 1 四分位数、中央値、平均値、第 3 四分位数、および対角線の上下の最大値を求める場合:

summary(c(A[upper.tri(A)],A[lower.tri(A)])).

于 2013-03-14T14:26:44.083 に答える
4

diag適切にサブセット化された行列の は、非対角線を提供します。例えば:

A <- matrix(1:16,4)
#upper off-diagonal
diag(A[-4,-1])
[1]  5 10 15
#lower off-diagonal
diag(A[-1,-4])
[1]  2  7 12
于 2012-10-24T12:59:08.587 に答える
1

行列の各列または行の非対角要素の最大値を保持するベクトルを取得するには、さらにいくつかの手順が必要です。その上で助けを求めていたとき、私はここに導かれました。おそらく他の人も同じことをするので、ここで学んだことを使用して見つけたこのソリューションを提供します。

秘訣は、非対角要素のみの行列を作成することです。検討:

> A <- matrix(c(10,2,3, 4,10,6, 7,8,10), ncol=3)
> A
     [,1] [,2] [,3]
[1,]   10    4    7
[2,]    2   10    8
[3,]    3    6   10
> apply(A, 2, max)
[1] 10 10 10

提案されたインデックスを使用してサブセット化A[row(A)!=col(A)]すると、非対角要素のベクトルが列順に生成されます。

> v <- A[row(A)!=col(A)]
> v
[1] 2 3 4 6 7 8

これを行列に戻すと、 を使用しapply()て、選択した関数を非対角要素のみのマージンに適用できます。max関数を例として使用します。

> A.off <- matrix(v, ncol=3)
> A.off
     [,1] [,2] [,3]
[1,]    2    4    7
[2,]    3    6    8
> v <- apply(A.off, 2, max)
> v
[1] 3 6 8

操作全体は、1 行でコンパクトに、そしてかなり暗号化してコーディングできます。

> v <- apply(matrix(A[row(A)!=col(A)], ncol=ncol(A)), 2, max)
> v
[1] 3 6 8
于 2014-04-20T12:12:43.810 に答える
0

行列 A に 1-diag (noofelements) を掛けるだけです。

たとえば、A が 4x4 行列の場合、

mean(A*(1-diag(4)) または A*(1-diag(nrow(A)))

これは、同じコード行を複数回実行する必要がある場合に高速です

于 2013-06-06T14:45:20.057 に答える
-1

ジェームズの答えに加えて、 diag 関数を使用して、 を使用して行列のすべての対角要素を直接除外できることを追加したいと思いますA[-diag(A)]。たとえば、次のことを考慮してください。 summary(A[-diag(A)])

于 2012-10-24T13:41:27.430 に答える