Подтвердить что ты не робот

Выбор подмножества столбцов в таблице данных.

Я хотел бы напечатать все столбцы таблицы данных dt, кроме одного из них с именем V3, но не хочу ссылаться на него по номеру, но по имени. Это код, который у меня есть:

  dt = data.table(matrix(sample(c(0,1),5,rep=T),50,10))
  dt[,-3,with=FALSE]   #  Is this the only way to not print column "V3"? 

Используя способ data frame, это можно сделать с помощью кода:

  df = data.frame(matrix(sample(c(0,1),5,rep=T),50,10))
  df[,!(colnames(df)%in% c("X3"))]

Итак, мой вопрос: есть ли другой способ не печатать один столбец в таблице данных без необходимости ссылаться на него по номеру? Я хотел бы найти нечто похожее на синтаксис фрейма данных, который я использовал выше, но используя таблицу данных.

4b9b3361

Ответ 1

Используйте очень похожий синтаксис, как для data.frame, но добавьте аргумент with=FALSE:

dt[, setdiff(colnames(dt),"V9"), with=FALSE]
    V1 V2 V3 V4 V5 V6 V7 V8 V10
 1:  1  1  1  1  1  1  1  1   1
 2:  0  0  0  0  0  0  0  0   0
 3:  1  1  1  1  1  1  1  1   1
 4:  0  0  0  0  0  0  0  0   0
 5:  0  0  0  0  0  0  0  0   0
 6:  1  1  1  1  1  1  1  1   1

Использование with=FALSE хорошо объяснено в документации для аргумента j в ?data.table:

j: имя одного столбца, один экземпляр имен столбцов, list() выражений имен столбцов, выражение или вызов функции, который оценивает список (включая data.frame и data.table которые также являются списками) или (когда with=FALSE), то же самое, что и j в [.data.frame.


Начиная с версии 1.1.2, это также можно сделать следующим образом:

keep <- setdiff(names(dt), "V9")
dt[, ..keep]

Префикс символа с .. будет искать в области вызова (то есть в Глобальной среде), и его значение будет иметь имена столбцов или номера (источник).

Ответ 2

Изменить 2019-09-27 с более современным подходом

Вы можете сделать это с patterns, как упомянуто выше; или вы можете сделать это с помощью !, если вектор имен уже существует:

dt[ , !'V3']
# or
drop_cols = 'V3'
dt[ , !..drop_cols]

.. означает "посмотреть на один уровень"


Старая версия с использованием with=FALSE (data.table постепенно отклоняется от этого аргумента)

Вот способ, который использует grep для преобразования в числовые и разрешить индексирование отрицательных столбцов:

dt[, -grep("^V3$", names(dt)), with=FALSE]

Вы сказали, что "V3" должен быть исключен, верно?

Ответ 3

Может быть, это только в последних версиях data.table(я использую 1.9.6), но вы можете сделать:

dt[, -'V3', with=FALSE]

Для нескольких столбцов:

dt[, -c('V3', 'V9'), with=FALSE]

Обратите внимание, что необходимы цитаты вокруг имен переменных.

Ответ 4

Начиная с версии 1.12.0, можно также выбирать столбцы, используя регулярные выражения для их имен:

iris_DT <- as.data.table(iris)

iris_DT[, .SD, .SDcols = patterns(".e.al")]