La última hoja de trucos de R data.table

Velocidad. Sintaxis concisa. Compatibilidad al revés.

Pero sobre todo velocidad.

Esas son algunas de las características que hacen que data.table sea atractivo para sus fanáticos.

E incluso si eres un usuario tidyverse confirmado (como yo), data.table puede ser una adición útil a tu kit de herramientas de R, especialmente cuando trabajas con grandes conjuntos de datos, en una aplicación Shiny o en una función de paquete. 

Esta hoja de trucos definitiva de R data.table es diferente de muchas otras porque es interactiva. Puede buscar una frase específica como agregar columna o por un tipo de grupo de tareas como Subconjunto o Remodelar . Además, debido a esta hoja de trucos incluye tidyverse código de “traducción”, también puede buscar un dplyr favorita verbo como mutan o por filas .

Los usuarios registrados pueden descargar una versión ampliada de esta tabla interactiva para usarla en sus propios sistemas. La inscripción es gratuita. 

Buscar tareas y código data.table y tidyverse

Tarea Tipo código data.table Código de Tidyverse
Leer en archivo CSV Importar mydt <- fread ("myfile.csv") myt <- read_csv ("myfile.csv") #O myt <- vroom :: vroom ("myfile.csv")
Importar el primer número x de filas de un archivo CSV Importar mydt_x <- fread ("myfile.csv", nrows = x) myt_x <- read_csv ("myfile.csv", n_max = x)
Importe solo aquellas filas de un archivo CSV que coincidan con un patrón determinado Importar mydt_pattern <- fread ("grep 'mypattern' myfile.csv") myt_pattern <- vroom :: vroom (pipe ("grep 'mypattern' myfile.csv"))
Importar un archivo comprimido .gz Importar mydt <- fread ("myfile.gz") myt <- vroom :: vroom ("myfile.gz")
Importar un archivo comprimido .zip importar mydt <- fread (cmd = 'descomprimir -cq myfile.zip') myt <- read_csv ("myfile.zip")
Crear una tabla de datos a partir de un marco de datos existente (tibble para tidyverse) Importar mydt <- as.data.table (mydf) #O

setDT (mydf)

myt <- as_tibble (mydf)
Altere data.table en su lugar sin hacer una copia Reñir a cualquier función que comience con set como setkey (mydt, mycol) o usando el operador: = entre corchetes no aplica
Ordenar filas en función de varios valores de columna Reñir a mydt2 <- mydt [pedido (colA, -colB)] #O

setorder (mydt, colA, -colB)

myt <- organizar (myt, colA, -colB)
Cambiar el nombre de las columnas Reñir a setnames (mydt, old = c ('colA', 'colB'), new = c ('NewColA', 'NewColB')) myt <- renombrar (myt, NewColA = colA, NewColB = colB)
Reordenación de columnas: mueva algunas columnas a la posición frontal (más a la izquierda) Reñir a setcolorder (mydt, c ("colB", "colC")) # colB ahora en la posición 1 y colC en la posición 2 myt <- reubicar (myt, colB, colC)
Filtrar filas para el número de fila n Subconjunto mydt2 <- mydt [n] myt2 <- rebanada (myt, n)
Filtrar por la última fila Subconjunto mydt2 <- mydt [.N] myt2 <- rebanada (myt, n ())
Filtrar filas por condición Subconjunto # En algunos casos, setkey (mydt, colA, colB) acelerará el rendimiento # para pruebas lógicas en colA y colB; lo mismo con otras columnas

mydt2 <- mydt [expresión lógica]

myt2 <- filtro (myt, expresión lógica)
Filtrar filas donde colA es igual a string1 o string2 Subconjunto mydt2 <- mydt [colA% chin% c ("cadena1", "cadena2")] myt2 <- filtro (myt, colA% en% c ("cadena1", "cadena2"))
Filtrar filas donde colA coincide con una expresión regular Subconjunto mydt2 <- mydt [colA% like% "mypattern"] myt2 <- filter (myt, stringr :: str_detect (colA, "mypattern"))
Filtrar filas donde los valores de colA están entre 2 números Subconjunto mydt2 <- mydt [colA% entre% c (n1, n2)] myt2 <- filtro (myt, entre (colA, n1, n2))
Filtrar las primeras n filas por grupo Subconjunto mydt2 <- mydt [, .SD [1: n], por = groupcol] myt2% group_by (groupcol)%>% slice (1: n)
Filtrar filas para obtener el valor máximo por grupo Subconjunto mydt2 <- mydt [, .SD [which.max (valcol)], por = groupcol] myt2% group_by (groupcol)%>% filter (valcol == max (valcol))
Seleccione la columna y devuelva los resultados como un vector Subconjunto myvec <- mydt [, colname] myvec <- pull (myt, colname)
Seleccione varias columnas para crear una nueva tabla de datos (marco de datos o tibble para tidyverse) Subconjunto mydt2 <- mydt [, lista (colA, colB)] #O

mydt2 <- mydt [,. (colA, colB)] #O

mydt2 <- mydt [, c ("colA", "colB")]

myt2 <- seleccionar (myt, colA, colB)
Seleccione varias columnas usando una variable que contenga los nombres de las columnas Subconjunto my_col_names <- c ("colA", "colB")

mydt2 <- mydt [, ..my_col_names] #O

mydt2 <- mydt [, my_col_names, with = FALSE]

my_col_names <- c ("colA", "colB")

myt2 <- seleccionar (myt, all_of (my_col_names))

Seleccione varias columnas y cambie el nombre de algunas Subconjunto mydt2 <- mydt [,. (newname1 = col1, newname2 = col2, col3)] myt2 <- seleccionar (myt, newname1 = col1, newname2 = col2, col3)
Excluir varias columnas Subconjunto mydt2 <- mydt [, -c ("colA", "colB")] #O

mydt2 <- mydt [,! c ("colA", "colB")] #O

my_col_names <- c ("colA", "colB")

mydt2 <- mydt [,! .. my_col_names]

myt2 <- seleccionar (myt, -c (colA, colB)) #OR

my_col_names <- c ("colA", "colB")

myt2 <- select (myt, - {{my_col_names}})

Eliminar filas duplicadas según los valores de varias columnas Subconjunto mydt2 <- único (mydt, by = c ("colA", "colB")) myt2 <- distinto (myt, colA, colB, .keep_all = TRUE)
Cuente filas únicas basadas en múltiples columnas Resumir uniqueN (mydt, by = c ("colA", "colB")) nrow (distinto (myt, colA, colB))
Ejecutar cálculos resumidos sobre datos Resumir mydt2 <- mydt [, myfun (colA ...)] myt2% resume (ColName = myfun (colA ...))
Ejecute cálculos resumidos en datos por un grupo Resumir mydt2 <- mydt [, myfun (colA ...), por = groupcol] myt2%

group_by (groupcol)%>%

resumir(

NewCol = myfun (colA ...)

)

Ejecute cálculos resumidos en datos por un grupo y nombre una nueva columna Resumir mydt2 <- mydt [,. (MyNewCol = myfun (colA ...)), por = groupcol] myt2%

group_by (groupcol)%>%

resumir(

NewCol = myfun (colA ...)

)

Ejecutar cálculos resumidos en datos de varios grupos Resumir mydt2 <- mydt [, myfun (colA ...), por =. (groupcol1, groupcol2)] myt2%

group_by (groupcol1, groupcol2)%>%

resumir(

NewCol = myfun (colA ...)

)

Ejecutar un cálculo de resumen en datos filtrados por varios grupos Resumir mydt2 <- mydt [expresión de filtro, myfun (colA), por =. (groupcol1, groupcol2)] myt2%

filter (expresión de filtro)%>%

group_by (groupcol1, groupcol2)%>%

resumir(

NewCol = myfun (colA), .groups = "mantener"

)

Contar el número de filas por grupos Resumir mydt2 <- mydt [,. N, by = groupcol] # para un grupo #O

mydt2 <- mydt [, .N, por =. (groupcol1, groupcol2)]

myt2 <- count (myt, groupcol) # para un grupo #O

myt2 <- recuento (myt, groupcol1, groupcol2)

Resuma varias columnas y devuelva resultados en varias columnas Resumir mydt2 <- mydt [, lapply (.SD, myfun),

.SDcols = c ("colA", "colB")]

myt2%

resumir(

a través de (c (colA, colB), myfun)

)

Resumir varias columnas por grupo y devolver resultados en varias columnas Resumir mydt2 <- mydt [, lapply (.SD, myfun),

.SDcols = c ("colA", "colB"), por = groupcol]

myt2%

group_by (groupcol)%>%

resumir (a través de (c (colA, colB), myfun))

Agregar una columna Calcular mydt [, MyNewCol: = myfun (colA)] myt%

mudar(

MyNewCol = myfun (colA)

)

Agregar varias columnas a la vez Calcular # usa cualquier función o expresión

mydt [, `: =` (NewCol1 = myfun (colA), NewCol2 = colB + colC)] #O

mydt [, c ("NewCol1", "newCol2"): = lista (myfun (colA), colB + colC)]

myt%

mudar(

MyNewCol1 = myfun (colA),

MyNewCol2 = colB + colC

)

Agregue una columna usando los valores actuales y anteriores de otra columna, como encontrar la diferencia entre el valor en una fecha y la fecha anterior Calcular mydt [, Diff: = colA - shift (colA)] myt <- mutate (myt, Diff = colA - lag (colA))
Agregar columna que hace referencia al valor anterior de una columna por grupo Calcular mydt2 <- mydt [, Diff: = colA - shift (colA), by = groupcol] myt2% group_by (groupcol)%>% mutate (Diff = colA - lag (colA))
Agregar columna con números de identificación de fila por grupo Calcular mydt [, myid: = 1: .N, by = groupcol] myt% group_by (groupcol)%>% mutate (myid = número_fila ())
Agregue una columna basada en varias condiciones sin usar múltiples declaraciones if else (como CASE de SQL) Calcular # Necesita data.table versión 1.13 o posterior

# Me gusta cada condición en una nueva línea pero eso no es obligatorio

mydt2 <- mydt [, NewCol: = fcase (

condición1, "Valor1",

condición2, "Valor2",

condición3, "Valor3",

valor predeterminado = "Otro" # para todo lo demás

)]

myt2%

mudar(

NewCol = case_when (

condición1 ~ "Valor1",

condición2 ~ "Valor2",

condición3 ~ "Valor3",

VERDADERO ~ "Otro"

)

)

Agregar columna mediante operación por fila Calcular mydt [, newcol: = myfun (colB, colC, colD), por = 1: nrow (mydt)]

# o si colA tiene todos los valores únicos

mydt [, newcol: = myfun (colB, colC, colD), por = colA]

myt%

por filas ()%>%

mudar(

newcol = myfun (colB, colC, colD)

)

# o

myt%

por filas ()%>%

mudar(

#utilice la sintaxis de selección de dplyr:

newcol = myfun (c_across (colB: colD))

)

Une dos conjuntos de datos por más de una columna; mantener todo en set1 pero solo coincidencias en set2 Unirse mydt <- dt2 [dt1, on = c ("dt2col" = "dt1col")] #O

mydt <- merge (dt1, dt2, by.x = "dt1col", by.y = "dt2col", all.x = TRUE) #O

setkey (dt1, "dt1col") setkey (dt2, "dt2col") mydt <- dt2 [dt1]

myt <- left_join (df1, df2, by = c ("df1col" = "df2col"))
Unir 2 conjuntos de datos por más de una columna: mantener todos en el conjunto 1 pero solo las coincidencias en el conjunto 2 Unirse mydt <- merge (dt1, dt2, by.x = c ("dt1colA", "dt1colB"), by.y = c ("dt2colA", "dt2colB"), all.x = TRUE, all.y = FALSE ) #O

setkey (dt1, dt1colA, dt1colB)

setkey (dt2, dt2colA, dt2colB)

mydt <- dt2 [dt1]

myt <- left_join (df1, df2, by = c ("df1colA" = "df2colA", "df1colB" = "df2colB"))
Une dos conjuntos de datos por una columna común; solo guarda fósforos Unirse mydt <- fusionar (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2") myt <- inner_join (df1, df2, by = c ("df1col" = "df2col"))
Unir dos conjuntos de datos por una columna común y mantener todos los datos en ambos conjuntos, haya o no coincidencias Unirse mydt <- fusionar (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2", all = TRUE) myt <- full_join (df1, df2, by = c ("df1col" = "df2col"))
Combine dos conjuntos de datos agregando filas de una a la parte inferior de otra Unirse mydt_joined <- rbindlist (lista (mydt, mydt2)) myt_joined <- bind_rows (myt, myt2)
Cambiar la forma de los datos de ancho a largo Remodelar mydt_long <- melt (mydt, measure.vars = c ("col1", "col2", "col3"), variable.name = "NewCategoryColName", value.name = "NewValueColName") myt_long <- pivot_longer (myt, cols = starts_with ("col"), names_to = "NewCategoryColName", values_to = "NewValueColName")
Cambiar la forma de los datos de largo a ancho Remodelar mydt_wide <- dcast (mydt, id_col1 ~ col1, value.var = "ValueColName") myt_wide <- pivot_wider (myt, names_from = col1, values_from = ValueColName)
Encadena múltiples expresiones Reñir a mydt [expr1] [expr2] myt%

expr1%>%

expr2

Exportar datos a un archivo CSV Exportar fwrite (mydt, "myfile.csv") write_csv (myt, "myfile.csv")
Agregar filas a un archivo CSV existente Exportar fwrite (mydt2, "myfile.csv", append = TRUE) vroom :: vroom_write (myt2, "myfile.csv", delim = ",", append = TRUE)
Exportar datos a un archivo CSV comprimido Exportar fwrite (mydt, "myfile.csv.gz", compress = "gzip") vroom :: vroom_write (myt, "myfile2.csv.gz")

¡Hay mucho más que aprender sobre data.table! Para conocer algunos conceptos básicos de data.table, consulte mi video introductorio de cinco minutos:

Finalmente, el sitio web data.table tiene mucha más información y consejos, como el uso setkey()y otros consejos de indexación.