2015-11-14 40 views
5

Come potrei fare per convertirelista Albero di invertire-matrice triangolare inferiore in R

m = list(1,2:3,4:6,7:10) 

a

 [,1] [,2] [,3] [,4] 
[1,] 0 0 0 10 
[2,] 0 0 6 9 
[3,] 0 3 5 8 
[4,] 1 2 4 7 

Un'idea o una guida sono apprezzati! Grazie per la vostra pazienza, nel caso in cui la domanda sia troppo ingenua o richieda informazioni aggiuntive (sarò lieto di fornire).

risposta

4

1) Sotto il lapply accoda n zeri per ogni componente m e sapply prende il primo n elementi di ogni componente del m rimodellare il risultato in una matrice. Infine invertiamo l'ordine delle righe della matrice risultante. Questo funziona anche se m non definisce una matrice triangolare:

n <- length(m) 
sapply(lapply(m, c, numeric(n)), head, n)[n:1, ] 

dando:

 [,1] [,2] [,3] [,4] 
[1,] 0 0 0 10 
[2,] 0 0 6 9 
[3,] 0 3 5 8 
[4,] 1 2 4 7 

Se n può essere zero quindi utilizzare rev(seq_len(n)) al posto di n:1.

2) Un diritto in avanti sapply funziona anche. Si antepone ogni componente inversa del m con il numero appropriato di zeri e rimodella in una matrice:

sapply(m, function(v) c(numeric(n - length(v)), rev(v))) 
7

Ill mandrino un metodo di base R avanti

# Create matrix with dimensions defined by the length of your list 
mat <- matrix(0, length(m), length(m)) 
# Fill in desired order 
mat[upper.tri(mat, TRUE)] <- unlist(m) 
# Order rows 
mat[length(m):1, ] 
+0

Perché la tua risposta è 100 volte migliore. Il numero da numerico a carattere numerico non è proprio il modo in cui le cose dovrebbero essere fatte –

+0

Sì, forse, ma penso che sia utile introdurre funzioni meno conosciute che si nascondono nei pacchetti (altrimenti l'ID non li conoscerà mai!) – user20650

1

Ecco un'altra opzione da considerare. Questo utilizza lengths per capire quanto è lungo il vettore più lungo, e quindi usa vapply, che si semplificherà automaticamente in una matrice (come sapply, ma più veloce).

len <- max(lengths(m))   ## What's the longest vector in m? 
vapply(m, function(x) { 
    length(x) <- len    ## Make all vectors the same length 
    rev(replace(x, is.na(x), 0)) ## Replace NA with 0 and reverse 
}, numeric(len)) 
#  [,1] [,2] [,3] [,4] 
# [1,] 0 0 0 10 
# [2,] 0 0 6 9 
# [3,] 0 3 5 8 
# [4,] 1 2 4 7 
1

Se si utilizza matrici sparse (dal pacchetto Matrix), questi saranno opera anche:

> N <- lengths(m) 
> sparseMatrix(i=1+length(m)-sequence(N), j=rep.int(N,N), x=unlist(m)) 
4 x 4 sparse Matrix of class "dgCMatrix" 

[1,] . . . 10 
[2,] . . 6 9 
[3,] . 3 5 8 
[4,] 1 2 4 7 

Questo è quasi lo stesso del linguaggio per matrici triangolari superiori:

> sparseMatrix(i=sequence(N), j=rep.int(N,N), x=unlist(m)) 
4 x 4 sparse Matrix of class "dgCMatrix" 

[1,] 1 2 4 7 
[2,] . 3 5 8 
[3,] . . 6 9 
[4,] . . . 10