varias superponer studio modificar lineas graficos graficas ejes r data.table

superponer - ¿Cómo extraer las primeras n filas por grupo?



superponer graficas en r (2)

Tengo un data.table dt . Esta tabla de datos se ordena primero por date columna (mi variable de agrupación), luego por age columna:

library(data.table) setkeyv(dt, c("date", "age")) # Sorts table first by column "date" then by "age" > dt date age name 1: 2000-01-01 3 Andrew 2: 2000-01-01 4 Ben 3: 2000-01-01 5 Charlie 4: 2000-01-02 6 Adam 5: 2000-01-02 7 Bob 6: 2000-01-02 8 Campbell

Mi pregunta es: me pregunto si es posible extraer las primeras 2 filas para cada fecha única. O expresado de manera más general:

¿Cómo extraer las primeras n filas dentro de cada grupo ?

En este ejemplo, el resultado en dt.f sería:

> dt.f = ???????? # function of dt to extract the first 2 rows per unique date > dt.f date age name 1: 2000-01-01 3 Andrew 2: 2000-01-01 4 Ben 3: 2000-01-02 6 Adam 4: 2000-01-02 7 Bob

ps Aquí está el código para crear la tabla de datos antes mencionada:

install.packages("data.table") library(data.table) date <- c("2000-01-01","2000-01-01","2000-01-01", "2000-01-02","2000-01-02","2000-01-02") age <- c(3,4,5,6,7,8) name <- c("Andrew","Ben","Charlie","Adam","Bob","Campbell") dt <- data.table(date, age, name) setkeyv(dt,c("date","age")) # Sorts table first by column "date" then by "age"


Probablemente no sea el método más rápido, pero proporciona cierta flexibilidad si no usa variables clave y necesita más flexibilidad. Al cambiar el Row.ID seleccionado, el número de primeros objetos se puede ajustar según sea necesario.

dt[, .( age , name , Row.ID = rank(age) ) , by = list(date)][Row.ID %in% (1:2), .(date , age , name )]


Sí, solo usa .SD e .SD según sea necesario.

DT[, .SD[1:2], by=date] date age name 1: 2000-01-01 3 Andrew 2: 2000-01-01 4 Ben 3: 2000-01-02 6 Adam 4: 2000-01-02 7 Bob

Editado según la sugerencia de @eddi.

La sugerencia de @eddi es acertada:

Use esto en su lugar, para la velocidad:

DT[DT[, .I[1:2], by = date]$V1] # using a slightly larger data set > microbenchmark(SDstyle=DT[, .SD[1:2], by=date], IStyle=DT[DT[, .I[1:2], by = date]$V1], times=200L) Unit: milliseconds expr min lq median uq max neval SDstyle 13.567070 16.224797 22.170302 24.239881 88.26719 200 IStyle 1.675185 2.018773 2.168818 2.269292 11.31072 200