Seleccione varias columnas en data.table por sus índices numéricos


143

¿Cómo podemos seleccionar múltiples columnas usando un vector de sus índices numéricos (posición) en data.table?

Así es como lo haríamos con un data.frame:

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

Respuestas:


185

Para las versiones de data.table >= 1.9.8 , todo lo siguiente simplemente 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 versiones de data.table < 1.9.8 (para las cuales la selección de columnas numéricas requirió el uso de with = FALSE), vea esta versión anterior de esta respuesta. Ver también NOTICIAS en v1.9.8, POTENCIALMENTE ROMPIENDO CAMBIOS, punto 3.


1
No hay problema. Compare también dt[,"a"]y dt[,"a", with=FALSE]vea qué opción útil es realmente.
Josh O'Brien

3
alguna forma de hacer esto sin con? por ejemplo DT[,list(b:c), como me pareció conveniente transformar las columnas directamente en la tabla de datos, por ejemplo, puedo hacerlo DT[,list(1/b,2*c)], pero esto no funciona con.
Jamborta

2
Un cambio en el paquete hará with=FALSEinnecesario en este caso: github.com/Rdatatable/data.table/issues/…
Frank

1
@Frank: ¡son buenas noticias! Gracias por llamar mi atención. Una vez que ese cambio llegue a la versión de data.table distribuida en CRAN, editaré esta respuesta para anunciar el cambio en la parte superior. (Y, por favor, usted o cualquier otra persona que lea esto, no dude en enviarme un recordatorio tan pronto como eso suceda).
Josh O'Brien

2
@Valentas Divertido deberías preguntar. No hay una data.frameforma compatible de usar with=FALSE. Sin embargo, a partir de hace aproximadamente 3 semanas, la versión de desarrollo de data.table se ha modificado para llamadas como dt[, 2], dt[, 2:3], dt[, "b"], y dt[, c("b", "c")]se comportan de la misma como lo hacen en la con data.frames sin tener que establecer explícitamente with=FALSE. ¡Es fantástico! Consulte aquí la confirmación particular, incluida la entrada NOTICIAS que describe el cambio.
Josh O'Brien

43

Es un poco detallado, pero me he acostumbrado a usar la .SDvariable oculta .

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

Es un poco complicado, pero no pierde otras características de tabla de datos (no creo), por lo que aún debería poder usar otras funciones importantes como unir tablas, etc.


66
No es una molestia y es muy útil al crear la lista de columnas mediante programación
Chris

39

Si desea usar nombres de columna para seleccionar las columnas, simplemente use .(), que es un 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

Desde v1.10.2 en adelante, también puede usar ..

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

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

dt[, ..keep_cols]

3
Gracias por esta respuesta ¡También encontré eso dt[, !..keep_cols]y dt[, -..keep_cols] funciona como se esperaba!
IceCreamToucan

3

@ Tom, muchas gracias por señalar esta solución. Funciona muy bien para mí.

Estaba buscando una manera de excluir una columna de la impresión y del ejemplo anterior. Para excluir la segunda columna, puede hacer algo como esto

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)]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.