2011-09-21 40 views
56

Có thể trong R để nói - tôi muốn tất cả các chỉ mục từ vị trí i đến hết véc tơ/ma trận? Giả sử tôi muốn một submatrix từ cột thứ 3 trở đi. Tôi hiện chỉ biết theo cách này:Lập chỉ mục thanh lịch đến cuối vector/ma trận

A = matrix(rep(1:8, each = 5), nrow = 5) # just generate some example matrix... 

A[,3:dim(A)[2]] # get submatrix from 3rd column onwards 

Nhưng tôi có thực sự cần phải viết xấu xí đó dim(A)[2]? Không có cách thanh lịch nào để nói "từ cột thứ 3 trở đi"? Một cái gì đó như A[,3:]? (hoặc A[,3:...])?

Trả lời

69

Đôi khi dễ dàng hơn để nói với R những gì bạn không muốn. Nói cách khác, loại bỏ các cột từ ma trận sử dụng lập chỉ mục tiêu cực:

Dưới đây là hai cách thay thế mà cả hai tạo ra kết quả tương tự:

A[, -(1:2)] 
A[, -seq_len(2)] 

Kết quả:

 [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 3 4 5 6 7 8 
[2,] 3 4 5 6 7 8 
[3,] 3 4 5 6 7 8 
[4,] 3 4 5 6 7 8 
[5,] 3 4 5 6 7 8 

Nhưng để trả lời câu hỏi của bạn theo yêu cầu: Sử dụng ncol để tìm số cột. (Tương tự như vậy có nrow để tìm số hàng.)

A[, 3:ncol(A)] 

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

Mẹo hay! Cảm ơn! '- (1: 2)' thực sự trông rất tuyệt ... alsa ncol (A) ngắn hơn nhiều so với mờ (A) [2]. Cảm ơn! – TMS

14

Đối với hàng (không cột theo ví dụ của bạn) sau đó head()tail() có thể được sử dụng.

A <- matrix(rep(1:8, each = 5), nrow = 5) 
tail(A, 3) 

là gần như giống nhau như

A[3:dim(A)[1],] 

(các rownames/chỉ số in là khác nhau là tất cả).

Những công việc cho các vectơ và dữ liệu khung quá:

> tail(1:10, 4) 
[1] 7 8 9 10 
> tail(data.frame(A = 1:5, B = 1:5), 3) 
    A B 
3 3 3 
4 4 4 
5 5 5 

Đối với các phiên bản cột, bạn có thể thích ứng tail(), nhưng nó là một chút phức tạp hơn. Tôi tự hỏi nếu NROW()NCOL() có thể có ích ở đây, chứ không phải là dim():

> A[, 3:NCOL(A)] 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 3 4 5 6 7 8 
[2,] 3 4 5 6 7 8 
[3,] 3 4 5 6 7 8 
[4,] 3 4 5 6 7 8 
[5,] 3 4 5 6 7 8 

Hoặc lật này trên đầu của nó và thay vì hỏi R cho điều gì đó, hỏi nó để thả những thứ thay thế. Đây là một chức năng đóng gói này:

give <- function(x, i, dimen = 1L) { 
    ind <- seq_len(i-1) 
    if(isTRUE(all.equal(dimen, 1L))) { ## rows 
     out <- x[-ind, ] 
    } else if(isTRUE(all.equal(dimen, 2L))) { ## cols 
     out <- x[, -ind] 
    } else { 
     stop("Only for 2d objects") 
    } 
    out 
} 

> give(A, 3) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 1 2 3 4 5 6 7 8 
[2,] 1 2 3 4 5 6 7 8 
[3,] 1 2 3 4 5 6 7 8 
> give(A, 3, dimen = 2) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 3 4 5 6 7 8 
[2,] 3 4 5 6 7 8 
[3,] 3 4 5 6 7 8 
[4,] 3 4 5 6 7 8 
[5,] 3 4 5 6 7 8 
+0

Xin chào Gavin, cảm ơn mẹo chức năng 'tail'. – TMS

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