2015-07-29 8 views
6

consideri Ho seguente matricePrendi l'ultimo elemento di una matrice

M <- matrix(1:9, 3, 3) 
M 
#  [,1] [,2] [,3] 
# [1,] 1 4 7 
# [2,] 2 5 8 
# [3,] 3 6 9 

voglio solo trovare l'ultimo elemento cioè M[3, 3]

Come questa colonna della matrice e la dimensione di riga sono dinamici non possiamo hardcode a M[3, 3]

Come posso ottenere il valore dell'ultimo elemento?

Attualmente ho fatto usando il codice seguente

M[nrow(M), ncol(M)] 
# [1] 9 

Esiste un modo migliore per farlo?

risposta

15

Una matrice R è solo un vettore con un attributo dim, quindi si può solo subset come uno

M[length(M)] 
## [1] 9 

Sebbene (come detto da @James) la soluzione potrebbe essere più generale caso in cui si desidera mantenere voi struttura a matrice, come è possibile aggiungere drop = FALSE

M[nrow(M), ncol(M), drop = FALSE] 
#  [,1] 
# [1,] 9 

anche se, la mia soluzione potrebbe essere anche modificato in modo simile utilizzando il 0.123.051,490288 millionssostituzione funzione

`dim<-`(M[length(M)], c(1,1)) 
#  [,1] 
# [1,] 9 

Alcuni Benchmarks (contributo di @ zx8754)

M <- matrix(runif(1000000),nrow=1000) 

microbenchmark(
    nrow_ncol={ 
    M[nrow(M),ncol(M)] 
    }, 
    dim12={ 
    M[dim(M)[1],dim(M)[2]] 
    }, 
    length1={ 
    M[length(M)] 
    }, 
    tail1={ 
    tail(c(M),1) 
    }, 
    times = 1000 
) 

# Unit: nanoseconds 
#  expr  min  lq  mean median  uq  max neval cld 
# nrow_ncol  605 1209 3799.908 3623.0 6038 27167 1000 a 
#  dim12  302  605 2333.241 1811.0 3623 19922 1000 a 
# length1  0  303 2269.564 1510.5 3925 14792 1000 a 
# tail 1 3103005 3320034 4022028.561 3377234.0 3467487 42777080 1000 b 
+3

ma il metodo proposto da op è perfettamente a posto ed è leggermente meno offuscante l'intenzione. – Roland

+3

@Roland Sono d'accordo è "OK", ma penso che OP non si rende conto che si occupa solo di un vettore e la sua cosa importante da realizzare quando si tratta di matrici in R. –

+1

Certo. Il mio commento era semplicemente un addendum. Ho già upvoted (e stavo preparando la stessa risposta). – Roland

2

avrei preferito fare:

tail(c(M),1) 
# [1] 9 
+0

Questa è anche una buona soluzione, ma dovresti spiegare che 'c' rimuove tutti gli attributi (incluso l'attributo' dim') e quindi costringe la matrice in un vettore atomico. 'as.vector' di solito è preferibile per questo (ricordo una citazione di B. Ripley a riguardo). – Roland

+0

interessante, non ha ancora sperimentato il licenziamento degli attributi tra 'c' e' as.vector' –

+0

'as.vector' rimuove anche tutti gli attributi se il risultato è atomico. Il motivo per usarlo è che il codice è più chiaro. – Roland