Как удалить столбец по имени в данных.стол?


чтобы избавиться от столбца с именем "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 155

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)

}

DT[,c:=NULL] # remove column c

для сведения.таблица, присваивая столбцу значение 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).