2011-09-21 13 views
56

E 'possibile in R dire - Voglio tutti gli indici dalla posizione i alla fine del vettore/matrice? Dire che voglio un submatrix dalla 3a colonna in poi. Attualmente conosco solo in questo modo:Elegante indicizzazione fino alla fine del vettore/matrice

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 

Ma ne ho veramente bisogno di scrivere quel brutto dim(A)[2]? Non c'è un modo elegante di dire "dalla 3a colonna in poi"? Qualcosa come A[,3:]? (o A[,3:...])?

risposta

69

A volte è più facile dire a R cosa si desidera non. In altre parole, escludere colonne dalla matrice utilizzando indicizzazione negativo:

Ecco due modi alternativi che entrambi producono lo stesso risultato:

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

risultati:

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

Ma a rispondi alla tua domanda come richiesto: usa ncol per trovare il numero di colonne. (Allo stesso modo non v'è nrow per trovare il numero di righe.)

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

Buoni consigli! Grazie! '- (1: 2)' sembra davvero bello ... alsa ncol (A) è molto più corto di dim (A) [2]. Grazie! – TMS

14

Per le righe (non le colonne secondo il vostro esempio), allora head() e tail() potrebbero essere utilizzati.

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

è quasi la stessa di

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

(i rownames/indici stampati sono differenti è tutto).

Coloro lavoro per vettori e dei dati telai troppo:

> 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 

Per le versioni delle colonne, si potrebbe adattare tail(), ma è un po 'più complicato. Mi chiedo se NROW() e NCOL() potrebbe essere utile qui, piuttosto che 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 

o capovolgere questo sulla testa e invece di chiedere R per le cose, chiedo di abbandonare le cose, invece. Ecco una funzione che incapsula questo:

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

Ciao Gavin, grazie per il suggerimento sulla funzione 'coda'. – TMS

Problemi correlati