Виберіть кілька стовпців у таблиці даних за їх числовими індексами


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/isissue/…
Франк

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. Це надзвичайно! Дивіться тут про конкретний комітет, включаючи запис НОВИНИ, що описує зміни.
Джош О'Брайен

43

Це трохи багатослівно, але я звик використовувати приховану .SDзмінну.

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

Це трохи клопоту, але ви не втрачаєте інших функцій data.table (я не думаю), тому ви все одно зможете використовувати інші важливі функції, такі як таблиці приєднання тощо.


6
Не клопотання і дуже корисно при програмному створенні списку стовпців
Кріс

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.