2017-11-03 1 views
0

Eine Matrix einer Form, wieKombinieren

structure(c("W1", NA, NA, NA, NA, "W1", NA, NA, NA, NA, NA, "W2", 
NA, NA, "W2", NA, "W2", NA, NA, "W2", NA, NA, "W3", "W3", NA, 
NA, "W2", NA, NA, "W2", NA, NA, "W3", "W3", NA, NA, NA, "W3", 
"W3", NA, NA, NA, NA, NA, NA, "W1", NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, "W2", NA, NA, "W2", "W1", NA, 
NA, NA, NA, "W1", NA, NA, NA, NA), .Dim = c(5L, 15L)) 

genmat 



    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] 
[1,] "W1" "W1" NA NA NA NA NA NA NA "W1" NA NA NA "W1" "W1" 
[2,] NA NA "W2" "W2" NA "W2" NA NA NA NA NA NA "W2" NA NA 
[3,] NA NA NA NA "W3" NA "W3" "W3" NA NA NA NA NA NA NA 
[4,] NA NA NA NA "W3" NA "W3" "W3" NA NA NA NA NA NA NA 
[5,] NA NA "W2" "W2" NA "W2" NA NA NA NA NA NA "W2" NA NA 

Ich möchte kombinieren diese Matrix und ihre Transponierte zu bekommen eine quadratische Matrix einer Form, die eine Matrix und ihre Transponierte eine quadratische symmetrische Matrix

erhalten
 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] 
[1,] "W1" "W1" NA NA NA NA NA NA NA "W1" NA NA NA "W1" "W1" 
[2,] "W1" "W1" NA NA NA NA NA NA NA "W1" NA NA NA "W1" "W1" 
[3,] NA NA "W2" "W2" NA "W2" NA NA NA NA NA NA "W2" NA NA 
[4,] NA NA "W2" "W2" NA "W2" NA NA NA NA NA NA "W2" NA NA 
[5,] NA NA NA NA "W3" NA "W3" "W3" NA NA NA NA NA NA NA 
[6,] NA NA "W2" "W2" NA "W2" NA NA NA NA NA NA "W2" NA NA 
[7,] NA NA NA NA "W3" NA "W3" "W3" NA NA NA NA NA NA NA 
[8,] NA NA NA NA "W3" NA "W3" "W3" NA NA NA NA NA NA NA 
[9,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
[10,] "W1" "W1" NA NA NA NA NA NA NA "W1" NA NA NA "W1" "W1" 
[11,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
[12,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
[13,] NA NA "W2" "W2" NA "W2" NA NA NA NA NA NA "W2" NA NA 
[14,] "W1" "W1" NA NA NA NA NA NA NA "W1" NA NA NA "W1" "W1" 
[15,] "W1" "W1" NA NA NA NA NA NA NA "W1" NA NA NA "W1" "W1" 

Diese Matrix nimmt ihre Elemente von der Iteration genmat und ihrer Transponierte. h. die Elemente der Ausgangsmatrix bei 1, 2, 10, 14 und 15 Spalten sind die gleichen wie die entsprechenden Spalten von und entsprechenden Transponierungsreihen von genmat.

Antwort

2

Ich bin wirklich nicht sicher, ob ich die Frage verstanden, aber dies scheint die erwartete Ausgabe zu geben:

genmat[apply(genmat, 2, function(col) match(TRUE, !is.na(col))), ] 

Was es tut: für die i -te Zeile des Ergebnisses, verwenden Sie die k -te Linie von , wobei k der Index des ersten nicht NA Wertes der i -ten Spalte von genmat ist.

In sehr explizite Ebene for-Schleifen, das würde wie folgt aussehen:

res <- matrix(NA_character_, nrow = NCOL(genmat), ncol = NCOL(genmat)) 

for (i in seq_len(NROW(res))) { 
    first_non_NA <- which(!is.na(genmat[, i]))[1] 
    res[i, ] <- genmat[first_non_NA, ] 
} 

Hinweis: Dies ist die Symmetrie von res nicht garantieren. Die Symmetrie kommt von einigen nicht expliziten Eigenschaften Ihrer Beispieldaten.