2012-04-03 4 views
16

Как выбрать все, кроме первых двух строк, например, набор данных mtcars?R синтаксис для выбора всех, кроме двух первых строк

Я знаю, что могу написать no_mazda <- mtcars[3:32], что действительно работает, пока я знаю количество строк. Но когда я не знаю числа строк, которые мне нужно написать, например. no_mazda <- mtcars[3:nrow(mtcars)], который также работает, но:

Является ли R более разумным синтаксисом, чем выражение, которое содержит mtcars два раза?

+0

я задал аналогичный вопрос некоторое время назад: http://stackoverflow.com/questions/ 7500644/elegant-indexing-up-to-end-of-vector-matrix – TMS

ответ

16

Я предпочитаю использовать tail с отрицательными значениями для n:

tail(mtcars,-2) 
+0

да, это аналог UNIX 'head -n -2', мне это тоже нравится :) +1 – TMS

+0

Этот ответ проще кодировать и интерпретировать. Он должен быть выбран в качестве ответа. – SmallChess

27

Отрицательные индексы означают "пропустить":

mtcars[-(1:2)] 

пропускает первые 2 индексов вектораmtcars. Если вам нужно пропустить первые 10, просто используйте mtcars[-(1:10)].

Обратите внимание, что вы говорите о «наборе данных», но код, который вы используете, предназначен для векторов, поэтому я также ответил, что если mtcars - это вектор. Если mtcars является dataframe и вы выбираете строки, вы должны использовать Запятая:

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

Я думал abo ut data frame, но мои пальцы написали «набор данных». mtcars - это кадр данных. Благодарю. –

2

Если вам случится быть с помощью data.table (и почему кто-то не использует его, если вы все равно используете data.frame?) - тогда вы можете использовать удобный .N оператор (more info), который по сути содержит количество строк в вашей таблице.

Вот рабочий пример:

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

Просто поменять, что 5 для 2, чтобы получить желаемый результат в OP еще.

Это, конечно, позволяет динамически использовать для таблиц различной длины, без необходимости всегда использовать функцию length(). Например, если вы знаете, что вы всегда хотите взять последние 5 строк таблицы и удалить самую последнюю строку - получение 4 строки в качестве вывода - то вы можете сделать что-то вроде следующего:

> 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 

Или просто всегда получить последнюю строку:

cars[.N] 

... что так же красиво и сжатый эквивалент Пайтона: cars[-1])

+0

Ничего себе. Я никогда об этом не знал. –

Смежные вопросы