2012-04-03 30 views
16

Làm cách nào để chọn tất cả trừ hai hàng đầu tiên, ví dụ: bộ dữ liệu mtcars?Cú pháp R để chọn tất cả trừ hai hàng đầu tiên

Tôi biết rằng tôi có thể viết no_mazda <- mtcars[3:32], hoạt động miễn là tôi biết số hàng. Nhưng khi tôi không biết số hàng tôi cần viết, ví dụ: no_mazda <- mtcars[3:nrow(mtcars)] nguyên nhân nào cũng có hiệu quả, nhưng:

R có cung cấp cú pháp thông minh hơn biểu thức bao gồm mtcars hai lần không?

+0

tôi hỏi một câu hỏi tương tự một số thời gian trước đây: http://stackoverflow.com/questions/ 7500644/elegant-indexing-up-to-end-of-vector-matrix – TMS

Trả lời

16

Tôi thích sử dụng tail với giá trị âm cho n:

tail(mtcars,-2) 
+0

vâng, đây là «đầu -2n» của UNIX tương tự, tôi cũng thích nó :) +1 – TMS

+0

Câu trả lời này dễ viết và dễ hiểu hơn. Nó sẽ được chọn làm câu trả lời. – SmallChess

27

chỉ số Negative nghĩa là "bỏ qua":

mtcars[-(1:2)] 

bỏ qua 2 chỉ số đầu tiên của vectormtcars. Nếu bạn cần bỏ qua 10 đầu tiên, chỉ cần sử dụng mtcars[-(1:10)].

Lưu ý rằng bạn nói về "tập dữ liệu" nhưng mã bạn sử dụng là dành cho vectơ, vì vậy tôi cũng trả lời là mtcars là một vectơ. Nếu mtcars là một dataframe và bạn đang chọn hàng, bạn phải sử dụng trailing dấu phẩy:

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

Tôi đã suy nghĩ abo ut dữ liệu khung, nhưng ngón tay của tôi đã viết "dataset". mtcars là một khung dữ liệu. Cảm ơn. –

2

Nếu bạn tình cờ được sử dụng một data.table (và tại sao mọi người không sử dụng nó, nếu bạn đang sử dụng một data.frame anyway?) - thì bạn có thể sử dụng toán tử .N tiện dụng (more info), trong đó có chứa số hàng trong bảng của bạn.

Dưới đây là một ví dụ làm việc:

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

Chỉ cần trao đổi rằng 5 cho 2 để có được kết quả mong muốn của OP.

Điều này tất nhiên cho phép sử dụng động cho các bảng có độ dài khác nhau mà không phải luôn sử dụng chức năng length(). Ví dụ, nếu bạn biết rằng bạn luôn muốn lấy 5 dòng cuối cùng của một bảng và loại bỏ các hàng cuối cùng - nhận được 4 hàng như đầu ra - sau đó bạn có thể làm một cái gì đó như sau:

> 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 

Hoặc đơn giản là luôn lấy hàng cuối cùng:

cars[.N] 

... mà chỉ là như tốt đẹp và súc tích như tương đương Python: cars[-1])

+0

Chà. Tôi không bao giờ biết về điều đó. –

Các vấn đề liên quan