2011-09-21 15 views
56

¿Es posible en R decir: quiero todos los índices desde la posición i hasta el final del vector/matriz? Digamos que quiero una submatriz desde la tercera columna en adelante. Yo sé que en la actualidad sólo de esta manera:Elegante indexación hasta el final del vector/matriz

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 

Pero lo que realmente necesita para escribir esa fea dim(A)[2]? ¿No hay una manera elegante de decir "desde la tercera columna en adelante"? Algo así como A[,3:]? (o A[,3:...])?

Respuesta

69

A veces es más fácil decirle a R qué no desea querer. En otras palabras, excluir a las columnas de la matriz mediante la indexación negativa:

Aquí hay dos formas alternativas de que ambos producen los mismos resultados:

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

Resultados:

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

Pero a Responda su pregunta como se le solicitó: Use ncol para encontrar el número de columnas. (Del mismo modo existe nrow para encontrar el número de filas.)

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

¡Buenos consejos! ¡Gracias! '- (1: 2)' realmente se ve bien ... alsa ncol (A) es mucho más corto que dim (A) [2]. ¡Gracias! – TMS

14

Para las filas (columnas no como por su ejemplo), entonces head()tail() y podría ser utilizado.

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

es casi el mismo que

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

(los rownames/índices impresos son diferentes es todo).

Los trabajos de vectores y tramas de datos también:

> 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 

Para las versiones de columna, se puede adaptar tail(), pero es un poco más complicado. Me pregunto si NROW() y NCOL() podría ser útil en este caso, en lugar de 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 voltear esto en la cabeza y en vez de pedir R cosas, pregunto para dejar caer las cosas en su lugar. Aquí hay una función que encapsula esto:

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

Hola Gavin, gracias por la sugerencia de la función 'tail'. – TMS

Cuestiones relacionadas