Отбрасывание столбцов рамки данных по имени

У меня есть несколько столбцов, которые я хотел бы удалить из фрейма данных. Я знаю, что мы можем удалить их по отдельности, используя что-то вроде:

df$x <- NULL

Но я надеялся сделать это с помощью меньшего количества команд.

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

df <- df[ -c(1, 3:6, 12) ]

Но меня беспокоит, что относительное положение моих переменных может измениться.

Учитывая, насколько мощным является R, я подумал, что может быть лучший способ, чем отбрасывать каждый столбец по одному.

Комментарии к вопросу (2)
Решение

Вы можете использовать простой список имен:


DF 
Комментарии (6)

Существует также команда subset, полезная, если вы знаете, какие столбцы вам нужны:


df 
Комментарии (10)
within(df, rm(x))

вероятно, проще всего, или для нескольких переменных:

within(df, rm(x, y))

Или если вы имеете дело с data.table (согласно https://stackoverflow.com/q/9202413):

dt[, x := NULL]   # Deletes column x by reference instantly.

dt[, !"x"]   # Selects all but x into a new data.table.

или для нескольких переменных

dt[, c("x","y") := NULL]

dt[, !c("x", "y")]
Комментарии (6)

Вы можете использовать %in% следующим образом:

df[, !(colnames(df) %in% c("x","bar","foo"))]
Комментарии (3)

список(нуль) также работает:


dat 
Комментарии (6)

Если вы хотите удалить столбцы по ссылке и избежать внутреннего копирования, связанные с данными.кадров то можно использовать данные.пакет столи функции:=`

Вы можете передать имена персонажей вектора в левой части: оператора= и нуль, а РГО.


library(data.table)

df 
Комментарии (0)

Есть потенциально более мощная стратегия, основанная на том, что команда grep() возвращает числовой вектор. Если у вас есть длинный список переменных, как это делаю я в одном из моих наборов данных, некоторые переменные, которые заканчиваются в ".А" и другие, которые заканчиваются в ".Б" и вы только хотите те, которые заканчиваются в ".А" (вместе со всеми переменными, которые Дон'т соответствовать либо рисунок, сделайте следующее:


dfrm2 
Комментарии (1)

Другой dplyr ответ. Если ваши переменные имеют некоторые общие структуры именования, вы могли бы попробовать starts_with(). Например


library(dplyr)
df 
Комментарии (1)

Из интереса, этот флагов одним из R's странно несколько синтаксических несоответствий. Например, учитывая двух столбцов фрейма данных:


df 
Комментарии (0)

Еще одна возможность:


df 
Комментарии (2)

Решение Dplyr

Я сомневаюсь, что это будет получить много внимания, но если у вас есть список столбцов, которые вы хотите удалить, и вы хотите сделать это в dplyr цепи я использую one_of()ввыберите` статья:

Вот простой, репродуктивно пример:


undesired 
Комментарии (2)

Вот это dplyr способ пойти об этом:

#df[ -c(1,3:6, 12) ]  # original
df.cut % select(-col.to.drop.1, -col.to.drop.2, ..., -col.to.drop.6)  # with dplyr::select()

Мне нравится это, потому что это'с интуитивно понятным для чтения &ампер; разобраться без аннотации и крепкими колоннами менять положение в пределах фрейма данных. Он также вытекает из векторной идиома, используя-, чтобы удалить элементы.

Комментарии (2)

Я продолжаю думать, что там должен быть лучший идиома, но для вычитания столбцы по имени, я, как правило, выполните следующие действия:


df 
Комментарии (2)

Там's в функцию, называемую dropNamed () в Бернд Bischl&#39;пакет SBBmisc`, который делает именно это.

BBmisc::dropNamed(df, "x")

Преимущество в том, что он избегает повторения аргумента фрейма данных и, таким образом, подходит для трубопроводов в magrittr(какdplyr` подходы):

df %>% BBmisc::dropNamed("x")
Комментарии (0)

Другое решение, если вы не'т хотите использовать @Хэдли's выше: если ты такой "аргумент" это имя столбца, который вы хотите удалить:

df[,-which(names(df) == "COLUMN_NAME")]
Комментарии (2)

За выберите(-one_of(drop_col_names)) показали в предыдущих ответах, есть несколько другихdplyrвариантов для удаления столбцов с помощью функции Select (), которые не связаны с определением все конкретные имена столбцов (с помощью dplyr Звездные войны выборки данных по какому разнообразие в имена столбцов):

library(dplyr)
starwars %>% 
  select(-(name:mass)) %>%        # the range of columns from 'name' to 'mass'
  select(-contains('color')) %>%  # any column name that contains 'color'
  select(-starts_with('bi')) %>%  # any column name that starts with 'bi'
  select(-ends_with('er')) %>%    # any column name that ends with 'er'
  select(-matches('^f.+s$')) %>%  # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%     # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species

1 Tatooine  Human  
2 Tatooine  Droid 
Комментарии (0)

Предоставить фрейм данных и через запятую имена удалить:


remove_features 
Комментарии (0)

Найти индекс колонки вы хотите удалить, используя что. Дайте эти показатели с отрицательным знаком (*-1). Тогда подмножество тех значений, которые будет удалить их из таблицы данных. Это пример.


DF 
Комментарии (0)