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

Выбор столбцов в кадре данных R на основе этих * not * в векторе

Я знаком с возможностью извлекать столбцы из фрейма данных (или матрицы) R следующим образом:

df.2 <- df[, c("name1", "name2", "name3")]

Но можно ли использовать ! или другой инструмент для выбора всех, кроме перечисленных столбцов?

Для фона у меня есть кадр данных с довольно несколькими векторами столбцов, и я бы хотел избежать:

  • Набрав большинство имен, когда я мог просто удалить меньшинство
  • Использование гораздо более короткого df.2 <- df[, c(1,3,5)], потому что, когда изменяется мой .csv файл, мой код идет, потому что нумерация уже не то же самое. Я новичок в R и думаю, что я усвоил трудный способ не использовать числовые векторы для больших df, которые могут измениться.

Я пробовал:

df.2 <- df[, !c("name1", "name2", "name3")]
df.2 <- df[, !=c("name1", "name2", "name3")]

И как только я набрал это, выяснилось, что это работает:

df.2 <- df[, !names(df) %in% c("name1", "name2", "name3")]

Есть ли лучший способ, чем этот последний?

4b9b3361

Ответ 1

Альтернативой grep является which:

df.2 <- df[, -which(names(df) %in% c("name1", "name2", "name3"))]

Ответ 2

Вы можете сделать более короткий вызов, который также более обобщен с отрицательным grep:

df.2 <- df[, -grep("^name[1:3]$", names(df) )] 

Так как grep возвращает числовые значения, вы можете использовать индексацию отрицательного вектора для удаления столбцов. Вы можете добавить дополнительные числа или более сложные шаблоны.

Ответ 3

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

rm.col <- function(df, ...) {
    x <- substitute(...())
    z <- Trim(unlist(lapply(x, function(y) as.character(y))))
    df[, !names(df) %in% z]
}

rm.col(mtcars, hp, mpg)

Первым аргументом является имя dataframe. следующие ... - имена любых столбцов, которые вы хотите удалить.

Ответ 4

Старый поток, но здесь другое решение:

df.2 <- subset(df, select=-c(name1, name2, name3))

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

Ответ 5

Самый простой способ, который приходит мне на ум:

filter_df < -df [, setdiff (имена (df), c ( "name1", "name2" )]

в основном вы вычисляете заданную разницу между полным списком имен столбцов и подмножеством, которое вы хотите отфильтровать (name1 и name2 выше).