R синтаксис для выбора всех, кроме двух первых строк - PullRequest
22 голосов
/ 03 апреля 2012

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

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

Обеспечивает ли R более умный синтаксис, чем выражение, включающее mtcars дважды?

Ответы [ 3 ]

32 голосов
/ 03 апреля 2012

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

mtcars[-(1:2)]

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

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

mtcars[-(1:2),]
22 голосов
/ 03 апреля 2012

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

tail(mtcars,-2)
2 голосов
/ 04 мая 2017

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

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

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

... которая так же хороша и лаконична, как и эквивалент Python: cars[-1])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...