2011-09-21 18 views
56

Czy w R można powiedzieć: chcę wszystkie indeksy od pozycji i do końca wektora/macierzy? Powiedz, że chcę submatrix od trzeciej kolumny. Obecnie tylko wiedzieć, w ten sposób:Eleganckie indeksowanie do końca wektora/macierzy

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 

Ale czy naprawdę muszę napisać, że brzydki dim(A)[2]? Czy nie ma eleganckiego sposobu na powiedzenie "od trzeciej kolumny"? Coś w rodzaju A[,3:]? (lub A[,3:...])?

Odpowiedz

69

Czasami łatwiej jest powiedzieć R, czego nie chcesz , aby chcesz. Innymi słowy, wykluczyć kolumny z macierzy za pomocą negatywnego indeksowania:

Oto dwa alternatywne sposoby, które zarówno produkują te same wyniki:

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

Rezultaty:

 [,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 

lecz odpowiedz na pytanie, które chcesz zadać: Użyj numeru ncol, aby znaleźć liczbę kolumn. (Podobnie jest nrow aby znaleźć liczbę wierszy.)

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

Dobre rady! Dzięki! '- (1: 2)' wygląda naprawdę fajnie ... alsa ncol (A) jest znacznie krótsza niż dim (A) [2]. Dzięki! – TMS

14

Dla wierszy (nie kolumny jak na swoim przykładzie) i następnie head()tail() mogłyby być wykorzystane.

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

jest prawie taka sama, jak

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

(na rownames/Wskaźniki drukowane różnią się wszystkie).

Ci praca dla wektorów i danych ramki też:

> 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 

Dla wersji kolumn, można dostosować tail(), ale jest to nieco trudniejsze. Zastanawiam się, czy NROW() i NCOL() może być tu przydatny, zamiast 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 

Albo przerzucić to na jego głowie i zamiast pytać R dla rzeczy, zapytać go upuścić rzeczy zamiast. Oto funkcja, która obejmuje:

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

Cześć Gavin, dziękuję za końcówkę funkcji "ogon". – TMS