2015-07-29 39 views
6

Xem xét Tôi đã theo ma trậnLấy yếu tố cuối cùng của một ma trận

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

Tôi chỉ muốn tìm ra yếu tố cuối cùng tức là M[3, 3]

Như cột ma trận này và kích thước hàng năng động, chúng tôi không thể hardcode nó đến M[3, 3]

Làm cách nào để có được giá trị của phần tử cuối cùng?

Hiện nay tôi đã thực hiện bằng cách sử dụng đoạn mã sau

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

Có cách nào tốt hơn để làm điều đó?

Trả lời

15

Một ma trận R chỉ là một véc tơ với một thuộc tính dim, vì vậy bạn chỉ có thể tập hợp con nó như một

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

Mặc dù (như đã đề cập bởi @ James) giải pháp của bạn có thể là tổng quát hơn trong trường hợp bạn muốn giữ cho bạn cấu trúc ma trận, như bạn có thể thêm drop = FALSE

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

Mặc dù, giải pháp hòan toàn có thể được sửa đổi một cách tương tự bằng cách sử dụng dim<- thay thế chức năng

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

Một số Benchmarks (đóng góp bởi @ 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

nhưng phương pháp của op đề xuất là hoàn toàn okay và hơi ít làm xáo trộn ý định. – Roland

+3

@ Roland Tôi đồng ý rằng "OK" nhưng tôi nghĩ OP không nhận ra rằng anh ta chỉ đề cập đến một vector và điều quan trọng của nó để nhận ra khi giao dịch với ma trận trong R. –

+1

Chắc chắn. Nhận xét của tôi chỉ là một phụ lục. Tôi đã upvoted (và đã chuẩn bị cùng một câu trả lời). – Roland

2

Tôi thà làm:

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

Đây cũng là một giải pháp tốt, nhưng bạn nên giải thích rằng 'c' loại bỏ tất cả các thuộc tính (bao gồm thuộc tính' dim') và do đó ép buộc ma trận thành một vector nguyên tử. 'as.vector' thường thích hợp hơn cho điều này (tôi nhớ một trích dẫn của B. Ripley về điều này). – Roland

+0

thú vị, chưa trải qua các thuộc tính loại bỏ giữa 'c' và' as.vector' –

+0

'as.vector' cũng loại bỏ tất cả các thuộc tính nếu kết quả là nguyên tử. Lý do để sử dụng nó là mã rõ ràng hơn. – Roland

Các vấn đề liên quan