2012-04-03 31 views
16

¿Cómo selecciono todas las filas menos las dos primeras, por ej. el conjunto de datos mtcars?Sintaxis R para seleccionar todas menos dos primeras filas

Sé que puedo escribir no_mazda <- mtcars[3:32], lo cual funciona mientras sepa el número de filas. Pero cuando no sé la cantidad de filas que necesito para escribir, p. Ej. no_mazda <- mtcars[3:nrow(mtcars)] cuál de las causas también funciona, pero:

¿Proporciona R una sintaxis más inteligente que una expresión que incluye mtcars dos veces?

+0

hice una pregunta similar hace algún tiempo: http://stackoverflow.com/questions/ 7500644/elegant-indexing-to-end-of-vector-matrix – TMS

Respuesta

16

Yo prefiero usar tail con valores negativos para n:

tail(mtcars,-2) 
+0

sí, esta es la analogía de 'head -n -2' de UNIX, me gusta también :) +1 – TMS

+0

Esta respuesta es más fácil de codificar e interpretar. Debe ser seleccionado como la respuesta. – SmallChess

27

índices negativos significan "skip":

mtcars[-(1:2)] 

salta 2 primeros índices de vectormtcars. Si necesita saltear los primeros 10, simplemente use mtcars[-(1:10)].

Tenga en cuenta que usted habla sobre "conjunto de datos", pero el código que utiliza es para los vectores, por lo que también respondió si mtcars es un vector. Si mtcars es una trama de datos y que está seleccionando filas, usted tiene que utilizar detrás de la coma:

mtcars[-(1:2),] 
+0

Estaba pensando en ut frame de datos, pero mis dedos escribieron "dataset". mtcars es un marco de datos. Gracias. –

2

Si sucede utilizar un data.table (y ¿por qué alguien no lo usaría, si está utilizando un data.frame de todos modos?) - entonces puede usar el práctico operador .N (more info), que en esencia contiene el número de filas en su tabla.

Aquí está un ejemplo de trabajo:

# make sure you have data.table 
install.packages("data.table") 
library(data.table) 

# load the mtcars data 
data(mtcars) 
# Make a data table out of the mtcars dataset 
cars <- as.data.table(mtcars, keep.rownames = TRUE) 

# Take all the rows from a given index (e.g. 5) to the end 
> cars[5:.N] 
        rn mpg cyl disp hp drat wt qsec vs am gear carb 
1: Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 
2:    Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 
3:   Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 
4:   Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 

... (truncated) 

sólo cambio que 5 para un 2 con el fin de obtener una salida deseada de la OP.

Esto, por supuesto, permite el uso dinámico para tablas de diferentes longitudes, sin tener que utilizar siempre la función length(). Por ejemplo, si se sabe que uno siempre quiere tener los últimos 5 filas de una tabla y quitar la última fila - conseguir 4 filas como salida - entonces usted puede hacer algo como lo siguiente:

> cars[(.N-4):(.N-1)] # note the expressions for slicing must be in parentheses 
      rn mpg cyl disp hp drat wt qsec vs am gear carb 
1: Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2 
2: Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.5 0 1 5 4 
3: Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.5 0 1 5 6 
4: Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.6 0 1 5 8 

O, simplemente, siempre obtener la última fila:

cars[.N] 

... que es tan agradable y concisa como equivalente de Python: cars[-1])

+0

Wow. Nunca supe de eso. –

Cuestiones relacionadas