R - min, max a průměrně mimo úhlopříčky prvků v matrici

hlasů
5

Mám jako matrice v oblasti výzkumu a chci se dostat:

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

S diagonální jsem max (diag (A)), min (diag (A)), průměr (diag (A)) a pracoval v pohodě

Ale pro off-diagonální jsem se pokusil

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

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

použít:

colMeans(dataD) # get the mean for columns

ale nemohu se dostat dataD b / c říká objekt ‚V1‘ nebyl nalezen

Dík!

Položena 24/10/2012 v 13:49
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
2

diagZ vhodně podmnožina matrice vám off-úhlopříčky. Například:

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
Odpovězeno 24/10/2012 v 13:59
zdroj uživatelem

hlasů
18

Tady row()a col()pomocné funkce jsou užitečné. Používání @James Amůžeme dostat horní off-úhlopříčka používat tento malý trik:

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

a dolní off diagonální přes toto:

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

Ty mohou být celkové dát cokoliv úhlopříčky chcete:

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

a nevyžadují žádnou podmnožin.

Pak je to jednoduchá záležitost, volání bez ohledu na funkci, kterou chcete na těchto hodnotách. Např:

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

Jestliže podle mého komentáři máte na mysli všechno kromě úhlopříčky , pak použijte

> 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..

Takže to není ztracen, Ben Bolker napovídá (v komentáři), že výše uvedený kód bloku může být provedeno více úhledně použitím row()a col()funkcí I výše uvedené:

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

což je lepší řešení celé kolo.

Odpovězeno 24/10/2012 v 14:02
zdroj uživatelem

hlasů
-1

Kromě Jamesova odpověď, chci dodat, že můžete použít Diag funkci přímo vyloučit všechny diagonální prvky matice použitím A[-diag(A)]. Zvažte například: summary(A[-diag(A)])

Odpovězeno 24/10/2012 v 14:41
zdroj uživatelem

hlasů
5

V jednom jednoduchém řádek kódu:

Pro matice A pokud chcete najít Minimum , 1. kvartilu Median, Mean , 3. Kvartil a Maximum na horní a nižší off úhlopříčky:

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

Odpovězeno 14/03/2013 v 15:26
zdroj uživatelem

hlasů
0

Jen násobit matici A 1-diag (nofelements)

Například jestliže je 4x4 matice, potom

znamená (A * (1-diag (4)) nebo A * (1-diag (nrow (A)))

To je rychlejší, když je potřeba spustit stejný řádek kódu vícekrát

Odpovězeno 06/06/2013 v 15:45
zdroj uživatelem

hlasů
1

Chcete-li získat vektor drží max off-diagonální prvky každé col nebo řádku matice vyžaduje několik dalších kroků. Zde jsem byl nařízen, když hledali pomoc na to. Možná, že ostatní budou dělat to samé, takže jsem se nabídnout toto řešení, které jsem našel pomocí toho, co jsem zde naučil.

Trik je vytvořit matrici pouze mimo diagonální prvky. Zvážit:

> 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

Podmnožin pomocí navrženého indexování, A[row(A)!=col(A)]produkuje vektor off-diagonální prvky, ve sloupci-pořadí:

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

Vrátíme-to na matrici umožňuje použití apply()aplikovat funkci volby na okraji jen mimo diagonální prvky. Použití maxfunkce jako příklad:

> 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

Celá operace může být kompaktní, a poněkud záhadně kódované v jednom řádku:

> v <- apply(matrix(A[row(A)!=col(A)], ncol=ncol(A)), 2, max)
> v
[1] 3 6 8
Odpovězeno 20/04/2014 v 13:12
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more