Подтвердить что ты не робот

Как я могу получить DataFrame с столбцами, временно удаленными по имени?

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

mtcars[ , "cyl"]

и

mtcars[ , 2]

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

mtcars[ , -2]

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

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

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

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

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

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

4b9b3361

Ответ 1

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

-() - это функция, и разработчики 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:] В свете Edit to the Q, указывающего на временное падение именованного столбца, необходимо:

subset(mtcars, select = -cyl)

или

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

- это опции, а прежнее - более чистое, чем последнее.

Ответ 2

Я часто использую 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).