Как удалить столбец по имени в данных.стол?
чтобы избавиться от столбца с именем "foo" в data.frame
, Я могу сделать:
df <- df[-grep('foo', colnames(df))]
однако, один раз df
превращается в data.table
объект, нет никакого способа просто удалить столбец.
пример:
df <- data.frame(id = 1:100, foo = rnorm(100))
df2 <- df[-grep('foo', colnames(df))] # works
df3 <- data.table(df)
df3[-grep('foo', colnames(df3))]
но как только он превращается в data.table
объект, это больше не работает.
8 ответов:
любой из следующих удалит столбец
foo
из данных.таблицаdf3
:# Method 1 (and preferred as it takes 0.00s even on a 20GB data.table) df3[,foo:=NULL] df3[, c("foo","bar"):=NULL] # remove two columns myVar = "foo" df3[, (myVar):=NULL] # lookup myVar contents # Method 2a -- A safe idiom for excluding (possibly multiple) # columns matching a regex df3[, grep("^foo$", colnames(df3)):=NULL] # Method 2b -- An alternative to 2a, also "safe" in the sense described below df3[, which(grepl("^foo$", colnames(df3))):=NULL]
данные.таблица также поддерживает следующий синтаксис:
## Method 3 (could then assign to df3, df3[, !"foo", with=FALSE]
хотя, если вы на самом деле хотите удалить столбец
"foo"
Сdf3
(в отличие от просто печати видdf3
столбец минус"foo"
) вы действительно хотите использовать метод 1 вместо этого.(обратите внимание, что если вы используете метод, основанный на
grep()
илиgrepl()
, вам необходимо установитьpattern="^foo$"
, а не"foo"
, если вы не хотите столбцы с именами, как"fool"
и"buffoon"
(т. е. те, которые содержатfoo
в качестве подстроки) также должны быть сопоставлены и удалены.)менее безопасные варианты, отлично подходит для интерактивного использования:
следующие две идиомы также будут работать -- если
df3
содержит столбец, соответствующий"foo"
-- но потерпит неудачу, вероятно, неожиданным образом, если это не так. Если, например, вы используете любой из них для поиска несуществующий столбец"bar"
, вы будете в конечном итоге с данными нулевой строки.стол.как следствие, они действительно лучше всего подходят для интерактивного использования, где можно, например, отображать данные.таблица минус любые столбцы с именами, содержащими подстроку
"foo"
. Для целей программирования (или если вы хотите фактически удалить столбец(ы) изdf3
а не из его копии), методы 1, 2a и 2b действительно являются лучшими вариантами.# Method 4a: df3[, -grep("^foo$", colnames(df3)), with=FALSE] # Method 4b: df3[, !grepl("^foo$", colnames(df3)), with=FALSE]
вы можете для этого, что позволяет избежать накладных расходов
[.data.table
в циклах:dt <- data.table( a=letters, b=LETTERS, c=seq(26), d=letters, e=letters ) set( dt, j=c(1L,3L,5L), value=NULL ) > dt[1:5] b d 1: A a 2: B b 3: C c 4: D d 5: E e
если вы хотите сделать это по имени столбца,
which(colnames(dt) %in% c("a","c","e"))
должны работать дляj
.
Я просто делаю это в виде фрейма данных:
DT$col = NULL
работает быстро и насколько я мог видеть, не вызовет никаких проблем.
обновление: не лучший метод, если ваш DT очень большой, как с помощью
$<-
оператор приведет к копированию объекта. Так что лучше использовать:DT[, col:=NULL]
очень простой вариант в случае, если у вас есть много отдельных столбцов для удаления в таблице данных, и вы хотите, чтобы избежать ввода всех имен столбцов #careadviced
dt <- dt[, -c(1,4,6,17,83,104), with =F]
вместо этого будут удалены столбцы на основе номера столбца.
Это, конечно, не так эффективно, потому что он обходит данных.преимущества таблицы, но если вы работаете с менее чем 500 000 строк, он отлично работает
предположим, что ваш dt имеет столбцы
col1
,col2
,col3
,col4
,col5
,coln
.чтобы удалить подмножество из них:
vx <- as.character(bquote(c(col1, col2, col3, coln)))[-1] DT[, paste0(vx):=NULL]
вот способ, когда вы хотите установить # столбцов в NULL, учитывая их имена столбцов функция для вашего использования:)
deleteColsFromDataTable
for (myNm in toDeleteColNames) train <- train [,(myNm):=NULL,with=F] return (train)
}
для сведения.таблица, присваивая столбцу значение NULL удаляет его:
DT[,c("col1", "col1", "col2", "col2")] <- NULL ^ |---- Notice the extra comma if DT is a data.table
... что эквивалентно:
DT$col1 <- NULL DT$col2 <- NULL DT$col3 <- NULL DT$col4 <- NULL
эквивалент для сведения.кадр такой:
DF[c("col1", "col1", "col2", "col2")] <- NULL ^ |---- Notice the missing comma if DF is a data.frame
Q. почему в версии для данных есть запятая.стол, и без запятой в версии для данных.кадр?
А. В качестве данных.кадры хранятся в виде списка столбцов, можно пропустить запятую. Вы также можете добавить его, однако затем вам нужно будет назначить их в список
NULL
s,DF[, c("col1", "col2", "col3")] <- list(NULL)
.