Чтобы избавиться от столбца с именем "foo" в a 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
объект, он больше не работает.
r
data.table
майазаура
источник
источник
dt
вместоdf3
...Ответы:
Любое из следующего удалит столбец
foo
из data.tabledf3
:data.table также поддерживает следующий синтаксис:
хотя, если вы действительно хотите удалить столбец
"foo"
изdf3
(а не просто печатать представлениеdf3
минус столбца"foo"
), вы бы действительно хотели использовать метод 1.(Обратите внимание, что если вы используете метод, основанный на
grep()
илиgrepl()
, вам нужно установитьpattern="^foo$"
вместо"foo"
, если вы не хотите, чтобы столбцы с такими именами, как"fool"
и"buffoon"
(то есть, содержащиеfoo
в качестве подстроки), также сопоставлялись и удалялись.)Менее безопасные варианты, отлично подходит для интерактивного использования:
Следующие две идиомы также будут работать - если
df3
содержит сопоставление столбцов"foo"
- но потерпят неудачу, вероятно, неожиданным образом, если это не так. Если, например, вы используете какой-либо из них для поиска несуществующего столбца"bar"
, вы получите нулевую строку data.table.Как следствие, они действительно лучше всего подходят для интерактивного использования, когда можно, например, захотеть отобразить таблицу данных за вычетом любых столбцов с именами, содержащими подстроку
"foo"
. Для целей программирования (или если вы действительно хотите удалить столбец (столбцы),df3
а не из его копии), методы 1, 2a и 2b - действительно лучшие варианты.Наконец, есть подходы, использующие подходы
with=FALSE
, хотя ониdata.table
постепенно отходят от использования этого аргумента, поэтому сейчас не рекомендуется, где вы можете его избежать; показывая здесь, чтобы вы знали, что опция существует на тот случай, если она вам действительно нужна:источник
-grep
сравнении!grepl
.grepl()
изначально, и это не сработало, поскольку столбцы data.table не могут быть проиндексированы логическим вектором. Но теперь я понимаю, чтоgrepl()
это можно сделать, обернув егоwhich()
так, чтобы он возвращал целочисленный вектор.data.table
, но этоwhich
удобно!data.table
ни; добавлен FR # 1797 . Но метод 1 (почти) бесконечно быстрее других. Метод 1 удаляет столбец по ссылке без копирования вообще. Я сомневаюсь, что вы получите его выше 0,005 секунд для любого размера data.table. Напротив, другие могут вообще не работать, если в таблице около 50% оперативной памяти, потому что они копируют все, кроме одного, которое нужно удалить.Вы также можете использовать
set
это, чтобы избежать накладных расходов[.data.table
в циклах:Если вы хотите сделать это по имени столбца,
which(colnames(dt) %in% c("a","c","e"))
должно работатьj
.источник
data.table
1.11.8, если вы хотите сделать это по имени столбца, вы можете сделать это напрямуюrm.col = c("a","b")
иdt[, (rm.col):=NULL]
Я просто делаю это во фрейме данных таким образом:
Работает быстро и, насколько я вижу, проблем не вызывает.
ОБНОВЛЕНИЕ: не лучший метод, если ваш DT очень большой, так как использование
$<-
оператора приведет к копированию объекта. Так что лучше используйте:источник
Очень простой вариант, если у вас есть много отдельных столбцов для удаления в таблице данных, и вы хотите избежать ввода всех имен столбцов #careadviced
Вместо этого будут удалены столбцы на основе номера столбца.
Очевидно, что он не так эффективен, потому что он обходит преимущества data.table, но если вы работаете с менее чем 500 000 строк, он работает нормально
источник
Предположим , что ваш дт имеет столбцы
col1
,col2
,col3
,col4
,col5
,coln
.Чтобы удалить их подмножество:
источник
Вот способ, когда вы хотите установить количество столбцов в NULL, если их имена столбцов являются функцией для вашего использования :)
источник
источник
Для data.table назначение столбца в NULL удаляет его:
... что эквивалентно:
Эквивалент для data.frame:
В. Почему в версии для data.table есть запятая, а в версии data.frame нет запятой?
О. Поскольку data.frames хранятся в виде списка столбцов, вы можете пропустить запятую. Вы также можете добавить его, тем не менее , то вам нужно будет назначить их в список
NULL
с,DF[, c("col1", "col2", "col3")] <- list(NULL)
.источник
data.frames
когда строки и столбцы будут переключаться. Это было бы нелогично.DF[column,row]
поэтому я просто хотел посмотреть, не было ли вообще случаев, когда это происходило.