Ответ 1
Альтернативой grep
является which
:
df.2 <- df[, -which(names(df) %in% c("name1", "name2", "name3"))]
Я знаком с возможностью извлекать столбцы из фрейма данных (или матрицы) 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")]
Есть ли лучший способ, чем этот последний?
Альтернативой grep
является which
:
df.2 <- df[, -which(names(df) %in% c("name1", "name2", "name3"))]
Вы можете сделать более короткий вызов, который также более обобщен с отрицательным grep:
df.2 <- df[, -grep("^name[1:3]$", names(df) )]
Так как grep возвращает числовые значения, вы можете использовать индексацию отрицательного вектора для удаления столбцов. Вы можете добавить дополнительные числа или более сложные шаблоны.
Вы можете создать настраиваемую функцию, если вы используете ее для собственного использования для управления данными. Я могу сделать что-то вроде этого:
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. следующие ...
- имена любых столбцов, которые вы хотите удалить.
Старый поток, но здесь другое решение:
df.2 <- subset(df, select=-c(name1, name2, name3))
Это было опубликовано в другом подобном потоке (хотя я не могу найти его прямо сейчас). Должен быть устойчивый код в описываемой вами ситуации и, вероятно, легче читать и редактировать, чем некоторые другие параметры.
Самый простой способ, который приходит мне на ум:
filter_df < -df [, setdiff (имена (df), c ( "name1", "name2" )]
в основном вы вычисляете заданную разницу между полным списком имен столбцов и подмножеством, которое вы хотите отфильтровать (name1 и name2 выше).