Как получить фрейм данных со столбцами, временно удаленными по имени? - PullRequest
22 голосов
/ 29 января 2011

Например, с набором данных mtcars

mtcars[ , "cyl"]

и

mtcars[ , 2]

оба дают мне один и тот же столбец. Итак, так как я могу получить все, но столбец 2, как это:

mtcars[ , -2]

Я не ожидаю этого:

mtcars[ , -"cyl"]
Error in -"cyl" : invalid argument to unary operator

Вместо этого лучшее, что я могу придумать, это:

mtcars[ , !colnames(mtcars)=="cyl"]

Есть ли более простое решение?

РЕДАКТИРОВАТЬ: Кажется логичным, что если первые два метода работают, то должны работать и два других метода. Я надеялся, что что-то упустил. Страницы справки для ?"[" или ?subset не объясняют этот нелогичный результат. Кто-нибудь знает, почему это так?

Ответы [ 2 ]

27 голосов
/ 29 января 2011

[Edit:] Объяснение того, почему отрицательные строковые индексы не работают:

-() - это функция, и разработчики R говорят, что ее нельзя использовать в символьном векторе (и не только потому, что отрицание строки не имеет смысла). Поскольку вы не можете отрицать символьный вектор, вы не можете предоставить отрицательные строки для удаления столбцов. Проблема с - и является источником сообщения об ошибке, которое вы цитируете. Отсюда правило, что отрицательные индексы работают только для чисел. Источник исходной ошибки:

> -"cyl"
Error in -"cyl" : invalid argument to unary operator

Обратите внимание, что в комментариях к Q было заблуждение, что отрицательная версия "cyl" была "-cyl", но это не просто строка. Приведенный выше фрагмент кода R показывает, что происходило в подмножестве, заданном в Вопросе.

Раздел 2.7 руководства " Введение в R " описывает разрешенные методы поднабора.

[Подлинный текст] Самый простой способ удалить компонент - просто установить для этого компонента значение NULL:

> cars <- mtcars
> cars[, "cyl"] <- NULL ## or cars$cyl <- NULL
> names(cars)
 [1] "mpg"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

[Edit:] В свете правки для Q, указывающей на временное падение именованного столбца, было необходимо:

subset(mtcars, select = -cyl)

или

mtcars[, !names(mtcars) %in% "cyl"]

варианты, и первый чище, чем последний.

12 голосов
/ 29 января 2011

Я часто использую subset. Пример использования mtcars

> names(mtcars)
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"
> cars <- subset(mtcars, select=-c(mpg,cyl))
> names(cars)
[1] "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

В ответах на этот вопрос есть и другие идеи .

Обновление: Подмножество также работает для временного удаления одного или нескольких столбцов по имени, просто замените mtcars[,-2] на subset(mtcars, select=-cyl).

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