Selecione várias colunas em data.table por seus índices numéricos


143

Como podemos selecionar várias colunas usando um vetor de seus índices numéricos (posição) em data.table?

É assim que faríamos com um data.frame:

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

Respostas:


185

Para versões do data.table >= 1.9.8 , tudo a seguir apenas funciona:

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

Para versões do data.table < 1.9.8 (para as quais a seleção numérica da coluna exigia o uso de with = FALSE), consulte esta versão anterior desta resposta. Consulte também NEWS na v1.9.8, POTENCIALMENTE QUEBRANDO ALTERAÇÕES, ponto 3.


1
Sem problemas. Compare também dt[,"a"]e dt[,"a", with=FALSE]veja como é realmente uma opção útil.
Josh O'Brien

3
alguma maneira de fazer isso sem com? por exemplo DT[,list(b:c), como achei conveniente transformar as colunas diretamente na tabela de dados, por exemplo, posso fazer isso DT[,list(1/b,2*c)], mas isso não funciona com.
Jamborta 14/11

2
Uma mudança para o pacote irá tornar with=FALSEdesnecessário neste caso: github.com/Rdatatable/data.table/issues/...
Frank

1
@Frank - Isso é uma ótima notícia! Obrigado por chamar minha atenção. Depois que essa alteração chegar à versão data.table distribuída no CRAN, editarei esta resposta para anunciar a alteração no topo. (E por favor - você ou qualquer outra pessoa que lê este -. Vontade para me executar ping com um lembrete assim que isso acontece)
Josh O'Brien

2
@ Valentas Engraçado, você deve perguntar. Não há uma data.framemaneira compatível de usarwith=FALSE . No entanto, a partir de cerca de 3 semanas atrás, a versão de desenvolvimento do data.table foi modificado para chamadas como dt[, 2], dt[, 2:3], dt[, "b"], e dt[, c("b", "c")]se comportam da mesma como fazem na com data.frames sem ter que explicitamente definido with=FALSE. É incrível! Veja aqui o commit específico, incluindo a entrada NEWS que descreve a alteração.
21416 Josh O'Brien

43

É um pouco detalhado, mas eu me acostumei a usar a .SDvariável oculta .

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

É um pouco complicado, mas você não perde outros recursos de data.table (eu não acho), então você ainda deve poder usar outras funções importantes, como juntar tabelas, etc.


6
Não é um aborrecimento e muito útil ao criar a lista coluna programaticamente
Chris

39

Se você deseja usar nomes de colunas para selecionar as colunas, basta usar .(), que é um alias para 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

A partir da v1.10.2, você também pode usar ..

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

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

dt[, ..keep_cols]

3
Obrigado por esta resposta. Eu também achei isso dt[, !..keep_cols]e dt[, -..keep_cols] funciona como esperado!
IceCreamToucan

3

@ Tom, muito obrigado por apontar esta solução. Funciona muito bem para mim.

Eu estava procurando uma maneira de excluir apenas uma coluna da impressão e do exemplo acima. Para excluir a segunda coluna, você pode fazer algo assim

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)]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.