2016-05-13 2 views
0

У меня есть таблица данных и хочу исключить некоторый набор столбцов. Например,Как исключить столбцы из таблицы данных?

library(data.table) 
dt <- data.table(a = 1:2, b = 2:3, c = 3:4, d = 4:5) 
dt[ , .(b, c)] 

Дает мне вторую и третью колонку, b и c. Как я вместо EXCLUDE столбцов b и c. Исходя из data.frame мира, я бы ожидать, что-то вроде следующего:

dt[ , -.(b, c)] 

или, может быть,

dt[ , !.(b, c)] 

Но neithr этих работ. Я знаю, что могу использовать

dt[ , -c(2:3), with = FALSE] 

, но это просто (как я понимаю) бросает data.table как data.frame и затем использует стандартные операции. Я хотел бы избежать этого, поскольку это a) вид обмана, b) дает ускорения скорости, доступные в data.table. Я просмотрел часто задаваемые вопросы по данным. И виньетку, и я не могу найти ничего.

(я знаю, что все это очень упрощенно, и я мог бы просто выбрать другие две колонки. Однако, это микрокосм много, гораздо больше, data.table я работаю с.)

+0

Вы можете использовать '' setdiff' т.е. дт [, setdiff (имена (дт), с (» b "," c ")), with = FALSE]' 'with = FALSE' необходимо для подмножества столбцов – akrun

+2

. Странно, что никого из них ниже не размещали' dt [, -c ("b", "c"), с = FALSE] 'или' dt [,! C ("b", "c"), с = FALSE] '. В любом случае, вы расплывчаты в том, что вы подразумеваете под «исключить». Удаление этих столбцов из таблицы сильно отличается от создания новой таблицы, в которой нет этих столбцов. Я не думаю, что 'with = FALSE' заставляет data.table как data.frame", но если вы действительно этого хотите, вы, вероятно, хотите 'setDF'. – Frank

+0

Я уже знаю, как сделать dt [, -c ("b", "c"), with = FALSE], о котором я упоминал в оригинальной записи. Чтобы быть ясным, у меня создается впечатление, что аргумент «with = FALSE» значительно замедляет работу data.tables, потому что тогда они рассматриваются как data.frames. Итак, я пытался избежать этого. Кроме того, «исключить», да, я имел в виду присвоение текущего DT новому DT без этих столбцов, а не удаление их на месте. (Я могу работать и с этим. Различие на самом деле не влияет на то, что я пытаюсь сделать.) – lukehawk

ответ

1

Вы можете делать:

dt[ , b := NULL][ , c := NULL] 

или вы можете использовать список столбцов, которые будут удалены:

xx <- c("b","c") # vector of columns you DON'T want 

# subset 
    dt <- dt[, !xx, with = FALSE] 
+3

Или 'dt [, \': = \ '(b = NULL, c = NULL)]' –

+0

Нет причин использовать 'dt <- dt [,! Xx, with = FALSE]', если вы назначаете результаты к той же переменной, лучше сделать ее ссылкой – jangorecki

4

Мы можем использовать setdiff

dt[, setdiff(names(dt), c("b", "c")), with = FALSE] 

или мы можем присвоить NULL (как и в других ответов), но в одном шаге

dt[, c("b", "c") := NULL][] 
Смежные вопросы