Выбор подмножества столбцов в таблице данных.
Я хотел бы напечатать все столбцы таблицы данных 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"))]
Итак, мой вопрос: есть ли другой способ не печатать один столбец в таблице данных без необходимости ссылаться на него по номеру? Я хотел бы найти нечто похожее на синтаксис фрейма данных, который я использовал выше, но используя таблицу данных.
Ответы
Ответ 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")]