2012-04-03 16 views
16

Wie wähle ich alle bis auf die ersten zwei Zeilen aus z. der mtcars-Datensatz?R-Syntax zum Auswählen aller bis auf zwei erste Zeilen

Ich weiß, dass ich no_mazda <- mtcars[3:32] schreiben kann, die funktioniert, solange ich die Anzahl der Zeilen kenne. Aber wenn ich die Anzahl der Zeilen nicht kenne, muss ich z.B. no_mazda <- mtcars[3:nrow(mtcars)] die Ursache funktioniert auch, aber:

Bietet R eine intelligentere Syntax als ein Ausdruck, der zweimal mtcars enthält?

+0

ich eine ähnliche Frage vor einiger Zeit gefragt: http://stackoverflow.com/questions/ 7500644/elegant-indexieren-up-to-end-of-vector-matrix – TMS

Antwort

16

ich mit lieber tail mit negativen Werten für n:

tail(mtcars,-2) 
+0

yeah, das ist die Analogie UNIX's 'head -n -2', gefällt mir auch :) +1 – TMS

+0

Diese Antwort ist einfacher zu codieren und interpretierbar. Es sollte als Antwort ausgewählt werden. – SmallChess

27

Negative Indizes bedeuten "überspringen":

mtcars[-(1:2)] 

ersten 2 Indizes Vektor springtmtcars. Wenn Sie die ersten 10 überspringen müssen, verwenden Sie einfach mtcars[-(1:10)].

Beachten Sie, dass Sie über "Dataset" sprechen, aber der Code, den Sie verwenden, ist für Vektoren, also antwortete ich auch, wenn mtcars ein Vektor ist. Wenn mtcars ein Datenrahmen ist und Sie Zeilen auswählen, müssen Sie Hinter Komma verwenden:

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

Ich dachte abo ut Datenrahmen, aber meine Finger schrieb "Datensatz". mtcars ist ein Datenrahmen. Vielen Dank. –

2

Wenn Sie eine data.table zu verwenden passieren (Und warum sollte jemand es nicht verwenden, wenn Sie sowieso einen data.frame verwenden?) - dann können Sie den handlichen Operator .N (more info) verwenden, der im Wesentlichen die Anzahl der Zeilen in Ihrer Tabelle enthält.

Hier ist ein funktionierendes Beispiel:

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

einfach tauschen, dass 5 für eine 2, um die OP der gewünschte Ausgabe zu erhalten.

Dies ermöglicht natürlich dynamische Verwendung für Tabellen unterschiedlicher Länge, ohne immer die length() Funktion verwenden zu müssen. Zum Beispiel, wenn Sie wissen, dass Sie die letzten fünf Zeilen einer Tabelle immer nehmen wollen und nehmen Sie die letzte Zeile - immer vier Reihen als Ausgabe - dann können Sie so etwas wie die folgenden tun:

> 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 

Oder einfach immer holen Sie sich die letzte Zeile:

cars[.N] 

..., die genauso schön und prägnant wie Python entspricht: cars[-1])

+0

Wow. Ich wusste nie davon. –

Verwandte Themen