Выберите несколько столбцов в data.table по их числовым индексам


143

Как мы можем выбрать несколько столбцов, используя вектор их числовых индексов (позиции) в data.table?

Вот как мы будем делать с data.frame:

df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
#   b c
# 1 2 3

Ответы:


185

Для версий data.table >= 1.9.8 все просто работает:

library(data.table)
dt <- data.table(a = 1, b = 2, c = 3)

# select single column by index
dt[, 2]
#    b
# 1: 2

# select multiple columns by index
dt[, 2:3]
#    b c
# 1: 2 3

# select single column by name
dt[, "a"]
#    a
# 1: 1

# select multiple columns by name
dt[, c("a", "b")]
#    a b
# 1: 1 2

Для версий data.table < 1.9.8 (для которых выбор числовых столбцов требовал использования with = FALSE), см. Эту предыдущую версию этого ответа. Смотрите также НОВОСТИ v1.9.8, ПОТЕНЦИАЛЬНО РАЗРЫВАЮЩИЕСЯ ИЗМЕНЕНИЯ, пункт 3.


1
Нет проблем. Сравните также dt[,"a"]и dt[,"a", with=FALSE]посмотрите, какой это полезный вариант.
Джош О'Брайен

3
любой способ сделать это без с? например DT[,list(b:c), как мне показалось удобным преобразовать столбцы непосредственно в таблице данных, например, я могу сделать DT[,list(1/b,2*c)], но это не работает с.
Джамборта

2
В этом случае изменение пакета сделает with=FALSEненужным: github.com/Rdatatable/data.table/issues/…
Фрэнк,

1
@Frank - это отличные новости Спасибо, что обратили на это мое внимание. Как только это изменение войдет в версию data.table, распространяемую в CRAN, я отредактирую этот ответ, чтобы объявить об этом сверху. (И пожалуйста - вы или кто-либо еще, кто читает это - не стесняйтесь пинговать меня напоминанием, как только это произойдет.)
Джош О'Брайен,

2
@Valentas Забавно, вы должны спросить. Нет data.frameсовместимого способа использования with=FALSE. Тем не менее, по состоянию на около 3 недель назад, разрабатываемая версия data.table была изменена на звонки , как dt[, 2], dt[, 2:3], dt[, "b"], и dt[, c("b", "c")]ведут себя так же , как они делают в с data.frameй без необходимости явно устанавливать with=FALSE. Это потрясающе! Смотрите здесь для конкретной фиксации, включая запись NEWS, описывающую изменения.
Джош О'Брайен

43

Это немного многословно, но я привык к использованию скрытой .SDпеременной.

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

Это немного хлопотно, но вы не теряете других функций data.table (я не думаю), поэтому вы все равно должны иметь возможность использовать другие важные функции, такие как таблицы соединений и т. Д.


6
Не хлопотно и очень полезно при программном создании списка столбцов
Chris

39

Если вы хотите использовать имена столбцов для выбора столбцов, просто используйте .(), который является псевдонимом для list():

library(data.table)
dt <- data.table(a = 1:2, b = 2:3, c = 3:4)
dt[ , .(b, c)] # select the columns b and c
# Result:
#    b c
# 1: 2 3
# 2: 3 4

19

Начиная с v1.10.2, вы также можете использовать ..

dt <- data.table(a=1:2, b=2:3, c=3:4)

keep_cols = c("a", "c")

dt[, ..keep_cols]

3
Спасибо за этот ответ. Я также нашел это dt[, !..keep_cols]и dt[, -..keep_cols] работает как ожидалось!
IceCreamToucan

3

@ Том, большое спасибо за указание на это решение. Это прекрасно работает для меня.

Я искал способ просто исключить один столбец из печати и из приведенного выше примера. Чтобы исключить второй столбец, вы можете сделать что-то вроде этого

library(data.table)
dt <- data.table(a=1:2, b=2:3, c=3:4)
dt[,.SD,.SDcols=-2]
dt[,.SD,.SDcols=c(1,3)]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.