2012-04-03 37 views
16

Come faccio a selezionare tutte le prime due righe tranne, ad es. il dataset mtcars?Sintassi R per selezionare tutte le prime due righe tranne

So che posso scrivere no_mazda <- mtcars[3:32], che funziona fino a quando conosco il numero di righe. Ma quando non conosco il numero di righe che devo scrivere ad es. no_mazda <- mtcars[3:nrow(mtcars)] che di causa funziona anche, ma:

R fornisce una sintassi più intelligente di un'espressione che include mtcars due volte?

+0

ho fatto una domanda simile qualche tempo fa: http://stackoverflow.com/questions/ 7500644/elegant-indexing-up-to-end-of-vector-matrix – TMS

risposta

16

Io preferisco usare tail con valori negativi per n:

tail(mtcars,-2) 
+0

sì, questa l'analogia 'testa -n -2' di UNIX, mi piace anche a me :) +1 – TMS

+0

Questa risposta è più facile da codificare e interpretare. Dovrebbe essere selezionato come risposta. – SmallChess

27

indici negativi significano "saltare":

mtcars[-(1:2)] 

salta primi 2 indici di vettoremtcars. Se hai bisogno di saltare prima il 10, usa solo mtcars[-(1:10)].

Nota che parli di "set di dati" ma il codice che usi è per i vettori, quindi ho anche risposto se mtcars è un vettore. Se mtcars è un dataframe e si selezionano le righe, è necessario utilizzare virgola finale:

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

Stavo pensando abo ut data frame, ma le mie dita scrivevano "dataset". mtcars è un frame di dati. Grazie. –

2

Se vi capita di essere utilizzando un data.table (e perché qualcuno non lo userebbe, se si utilizza comunque un data.frame?) - quindi è possibile utilizzare il pratico operatore .N (more info), che in sostanza contiene il numero di righe nella tabella.

Ecco un esempio di lavoro:

# 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) 

Appena swap 5 per un 2 per ottenere l'uscita desiderata del PO.

Questo naturalmente consente l'utilizzo dinamico per tabelle di lunghezze diverse, senza dover sempre utilizzare la funzione length(). Ad esempio, se si sa che si vuole sempre prendere gli ultimi 5 righe di una tabella e rimuovere l'ultima fila - ottenendo 4 file come uscita - allora si può fare qualcosa di simile al seguente:

> 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 semplicemente sempre ottenere l'ultima riga:

cars[.N] 

... che è altrettanto bello e conciso come equivalenti di Python: cars[-1])

+0

Wow. Non lo sapevo mai. –

Problemi correlati