Любое из следующего удалит столбец foo
из data.table 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]
data.table также поддерживает следующий синтаксис:
## Method 3 (could then assign to df3,
df3[, !"foo"]
хотя, если вы действительно хотите удалить столбец "foo"
из df3
(а не просто печатать представление df3
минус столбца "foo"
), вы бы действительно хотели использовать метод 1.
(Обратите внимание, что если вы используете метод, основанный на grep()
или grepl()
, вам нужно установить pattern="^foo$"
вместо "foo"
, если вы не хотите, чтобы столбцы с такими именами, как "fool"
и "buffoon"
(то есть, содержащие foo
в качестве подстроки), также сопоставлялись и удалялись.)
Менее безопасные варианты, отлично подходит для интерактивного использования:
Следующие две идиомы также будут работать - если df3
содержит сопоставление столбцов"foo"
- но потерпят неудачу, вероятно, неожиданным образом, если это не так. Если, например, вы используете какой-либо из них для поиска несуществующего столбца "bar"
, вы получите нулевую строку data.table.
Как следствие, они действительно лучше всего подходят для интерактивного использования, когда можно, например, захотеть отобразить таблицу данных за вычетом любых столбцов с именами, содержащими подстроку "foo"
. Для целей программирования (или если вы действительно хотите удалить столбец (столбцы), df3
а не из его копии), методы 1, 2a и 2b - действительно лучшие варианты.
# Method 4:
df3[, .SD, .SDcols = !patterns("^foo$")]
Наконец, есть подходы, использующие подходы with=FALSE
, хотя они data.table
постепенно отходят от использования этого аргумента, поэтому сейчас не рекомендуется, где вы можете его избежать; показывая здесь, чтобы вы знали, что опция существует на тот случай, если она вам действительно нужна:
# Method 5a (like Method 3)
df3[, !"foo", with=FALSE]
# Method 5b (like Method 4)
df3[, !grep("^foo$", names(df3)), with=FALSE]
# Method 5b (another like Method 4)
df3[, !grepl("^foo$", names(df3)), with=FALSE]
dt
вместоdf3
...