2015-07-29 15 views
6

Rozważmy następujące mam macierzyUzyskaj ostatni element macierzy

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

Chcę tylko znaleźć ostatni element czyli M[3, 3]

W kolumnie tej macierzy i wielkość rzędu są dynamiczne nie możemy zakodować to do M[3, 3]

Jak mogę uzyskać wartość ostatniego elementu?

Obecnie zrobiłem przy użyciu kodu poniżej

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

Czy istnieje lepszy sposób to zrobić?

Odpowiedz

15

Matryca w R jest tylko wektor z atrybutem dim, więc można po prostu podzbiór go jako jeden

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

Chociaż (jak wspomniano przez @James) rozwiązanie może być bardziej ogólny sprawa chcesz zachować Ci strukturę matrycy, jak można dodać drop = FALSE

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

choć moje rozwiązanie może być także modyfikowane w podobny sposób używając dim<- zastąpienie funkcji

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

Niektóre Benchmarki (nadesłane przez @ 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

ale metoda proponowana przez PO jest całkowicie w porządku i jest nieco mniej zaciemniające intencję. – Roland

+3

@Roland Zgadzam się, że to "OK", ale myślę, że OP nie zdaje sobie sprawy, że ma do czynienia tylko z wektorem i jego ważną rzeczą do zrealizowania, gdy mamy do czynienia z macierzami w R. –

+1

Pewnie. Mój komentarz był jedynie dodatkiem. Już przegłosowałem (i przygotowywałem tę samą odpowiedź). – Roland

2

wolałbym zrobić:

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

Jest to również dobre rozwiązanie, ale powinieneś wyjaśnić, że 'c' usuwa wszystkie atrybuty (w tym atrybut' dim'), a tym samym zmusza matrycę do wektora atomowego. "as.vector" jest zwykle preferowany do tego (pamiętam cytat B. Ripleya na ten temat). – Roland

+0

interesujące, nie doświadczyłem jeszcze usunięcia atrybutów między 'c' i' as.vector' –

+0

'as.vector' usuwa także wszystkie atrybuty, jeśli wynik jest atomowy. Powodem jest to, że kod jest bardziej przejrzysty. – Roland