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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow