data.table
Añadiendo y modificando columnas.
Buscar..
Observaciones
La viñeta oficial, "Semántica de referencia" , es la mejor introducción a este tema.
Un recordatorio: la sintaxis de DT[where, select|update|do, by]
se utiliza para trabajar con columnas de una tabla de datos.
- La parte "donde" es el argumento
i
- La parte "seleccionar | actualizar | hacer" es el argumento
j
Estos dos argumentos generalmente se pasan por posición en lugar de por nombre.
Todas las modificaciones a las columnas se pueden hacer en j
. Además, la función de set
está disponible para este uso.
Editando valores
# example data
DT = as.data.table(mtcars, keep.rownames = TRUE)
Editando una columna
Use el operador :=
dentro de j
para crear nuevas columnas o modificar las existentes:
DT[, mpg_sq := mpg^2]
Edición en un subconjunto de filas
Utilice el argumento i
para subcontratar a las filas "donde" se deben realizar las ediciones:
DT[1:3, newvar := "Hello"]
Al igual que en un data.frame, podemos subcontratar utilizando números de fila o pruebas lógicas. También es posible utilizar [una "unión" en i
cuando se modifica] [need_a_link].
Quitando una columna
Elimine las columnas estableciendo NULL
:
DT[, mpg_sq := NULL]
Tenga en cuenta que no <-
asignamos el resultado, ya que DT
se ha modificado in situ.
Editando multiples columnas
Agregue varias columnas usando el formato multivariado del operador :=
DT[, `:=`(mpg_sq = mpg^2, wt_sqrt = sqrt(wt))]
# or
DT[, c("mpg_sq", "wt_sqrt") := .(mpg^2, sqrt(wt))]
La sintaxis .()
Se usa cuando el lado derecho de LHS := RHS
es una lista de columnas.
Edición de múltiples columnas dependientes secuencialmente
Si las columnas son dependientes y deben definirse en secuencia, algunas formas de hacerlo son:
DT[, c("mpg_sq", "mpg2_hp") := .(temp1 <- mpg^2, temp1/hp)]
# or
DT[, c("mpg_sq", "mpg2_hp") := {temp1 = mpg^2; .(temp1, temp1/hp)}]
Edición de columnas por nombres determinados dinámicamente.
Para nombres de columna determinados dinámicamente, use paréntesis:
vn = "mpg_sq"
DT[, (vn) := mpg^2]
Usando set
Las columnas también pueden modificarse con el set
para una pequeña reducción en la sobrecarga, aunque esto rara vez es necesario:
set(DT, j = "hp_over_wt", v = mtcars$hp/mtcars$wt)
Reordenar columnas
# example data
DT = as.data.table(mtcars, keep.rownames = TRUE)
Para reorganizar el orden de las columnas, use setcolorder
. Por ejemplo, para revertirlos.
setcolorder(DT, rev(names(DT)))
Esto no cuesta casi nada en términos de rendimiento, ya que solo está permutando la lista de punteros de columna en la tabla de datos.
Renombrando columnas
# example data
DT = as.data.table(mtcars, keep.rownames = TRUE)
Para cambiar el nombre de una columna (mientras se mantienen sus datos iguales), no es necesario copiar los datos a una columna con un nombre nuevo y eliminar el anterior. En su lugar, podemos usar
setnames(DT, "mpg_sq", "mpq_squared")
Para modificar la columna original por referencia.
Modificación de niveles de factor y otros atributos de columna.
# example data
DT = data.table(iris)
Para modificar los niveles de factor por referencia, use setattr
:
setattr(DT$Species, "levels", c("set", "ver", "vir")
# or
DT[, setattr(Species, "levels", c("set", "ver", "vir"))]
La segunda opción podría imprimir el resultado en la pantalla.
Con setattr
, evitamos la copia en la que se incurre al realizar los levels(x) <- lvls
, pero también omite algunas comprobaciones, por lo que es importante tener cuidado de asignar un vector de niveles válido.