2012-08-13 17 views
13

Me gustaría imprimir todas las columnas de una tabla de datos dt excepto una de ellas denominada V3 pero no quiero referirme a ella por número, sino por nombre. Este es el código que tengo:Seleccionar un subconjunto de columnas en un data.table

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"? 

Utilizando el camino data frame, se podría hacer esto a través del código:

df = data.frame(matrix(sample(c(0,1),5,rep=T),50,10)) 
    df[,!(colnames(df)%in% c("X3"))] 

Por lo tanto, mi pregunta es: ¿hay otra manera para no imprimir una columna en una tabla de datos sin la necesidad de referirse a ella por número? Me gustaría encontrar algo similar a la sintaxis del marco de datos que utilicé anteriormente, pero usando la tabla de datos.

+0

Posible duplicado de [Seleccionar subconjunto de columnas en data.table R] (https://stackoverflow.com/questions/28094645/select-subset-of-columns-in-data-table-r) – hhh

+0

@hhh eso es no es un duplicado correcto; debe cerrarse al revés – Jaap

+0

@Jaap Lo sé, pero la calidad del hilo de pregunta más nuevo es mejor, por lo tanto, he votado de otra manera. – hhh

Respuesta

26

utilizar una sintaxis muy similar a la de un data.frame, además de añadir el argumento 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 

El uso de with=FALSE está muy bien explicado en la documentación para el argumento j en ?data.table:

j: nombre de una sola columna, expresión única de nombres de columna, list() de expresiones de nombres de columna, una llamada de expresión o función t hat evalúa la lista (incluidas data.frame y data.table que también son listas) o (cuando with=FALSE) lo mismo que j en [.data.frame.


De v1.10.2 en adelante también es posible hacer esto de la siguiente manera:

keep <- setdiff(names(dt), "V9") 
dt[, ..keep] 

prefijar un símbolo con .. se verá en llamar a su alcance (es decir, el Medio Ambiente Mundial) y se toma su valor como nombres o números de columnas (source).

9

Aquí está una manera que utiliza grep para convertir a numérico y permitir la indexación de la columna negativa:

dt[, -grep("^V3$", names(dt)), with=FALSE] 

Dijiste "V3" iba a ser excluidos, ¿verdad?

+0

sí. Quería excluir '' V3''. ¡Gracias! – Nestorghh

+0

¿Qué tal con este enfoque si desea excluir más de una [email protected] – Nestorghh

+2

Es muy fácil agregar condiciones con regex-grep. Simplemente use el símbolo O "|". 'dt [, -grep ("^V3 $ |^V9 $ ", nombres (dt), con = FALSE' –

7

Tal vez sea sólo en las versiones recientes de data.table (estoy usando 1.9.6), pero se puede hacer:

dt[, -'V3', with=FALSE] 

Durante varias columnas:

dt[, -c('V3', 'V9'), with=FALSE] 

Tenga en cuenta que la las citas alrededor de los nombres de las variables son necesarias.

Cuestiones relacionadas