seleccionar - Seleccionando un subconjunto de columnas en una tabla de datos.
seleccionar datos en r (4)
Me gustaría imprimir todas las columnas de una tabla de datos dt
excepto una de ellas llamada V3
pero no quiero referirme a ella por número sino por nombre. Este es el código que tengo:
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"?
Usando el modo de data frame
, uno 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"))]
Entonces, mi pregunta es: ¿hay otra manera de 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 usé anteriormente, pero usando la tabla de datos.
Aquí hay una manera que usa grep
para convertir a numérico y permitir la indexación de columna negativa:
dt[, -grep("^V3$", names(dt)), with=FALSE]
Usted dijo que "V3" iba a ser excluido, ¿verdad?
Desde la versión 1.12.0 en adelante, también es posible seleccionar columnas usando expresiones regulares en sus nombres:
iris_DT <- as.data.table(iris)
iris_DT[, .SD, .SDcols = patterns(".e.al")]
Tal vez sea solo en versiones recientes de data.table (estoy usando 1.9.6), pero puedes hacerlo:
dt[, -''V3'', with=FALSE]
Para varias columnas:
dt[, -c(''V3'', ''V9''), with=FALSE]
Tenga en cuenta que las citas alrededor de los nombres de variables son necesarias.
Use una sintaxis muy similar a la de un data.frame
, pero agregue 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
se explica muy bien en la documentación para el argumento j
en ?data.table
:
j: Un solo nombre de columna, una sola expresión de nombres de columnas, una list()
de expresiones de nombres de columnas, una expresión o función llamada que se evalúa en una lista (incluidos data.frame
y data.table
que también son listas), o (cuando with=FALSE
) igual que j en [.data.frame
.
A partir de la v1.10.2 también es posible hacerlo de la siguiente manera:
keep <- setdiff(names(dt), "V9")
dt[, ..keep]
Prefijar un símbolo con ..
buscará en el alcance de la llamada (es decir, el entorno global) y su valor se toma como nombres de columna o números ( source ).