Volviendo a la primera fila del grupo

Tengo un dataframe que consiste en una ID , que es la misma para cada elemento en un grupo, dos fechas y el intervalo de tiempo entre estos dos. Uno de los objetos datetime es mi marcador de tiempo relevante. Ahora me gusta obtener un subconjunto del dataframe que consiste en la entrada más temprana para cada grupo. Las entradas (especialmente el intervalo de tiempo) deben permanecer intactas.

Mi primer acercamiento fue ordenar el marco según 1. ID y 2. datetime relevante. Sin embargo, no pude devolver la primera entrada para cada grupo nuevo.

Luego he estado mirando la función aggregate() así como ddply() , pero no pude encontrar una opción en ambos que solo devuelva la primera entrada sin aplicar una función de agregación al valor del intervalo de tiempo.

¿Hay una manera fácil de lograr esto?

ADICIÓN: Tal vez no estaba claro al agregar mis notas agregadas () y ddply (). No necesariamente necesito agregar. Dado que el dataframe está ordenado de manera que la primera fila de cada nuevo grupo es la fila que estoy buscando, sería suficiente devolver un subconjunto con cada fila que tenga una ID diferente a la anterior (que es la fila de inicio de cada nuevo grupo).

Ejemplo de datos:

 structure(list(ID = c(1454L, 1322L, 1454L, 1454L, 1855L, 1669L, 1727L, 1727L, 1488L), Line = structure(c(2L, 1L, 3L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("A", "B", "C"), class = "factor"), Start = structure(c(1357038060, 1357221074, 1357369644, 1357834170, 1357913412, 1358151763, 1358691675, 1358789411, 1359538400 ), class = c("POSIXct", "POSIXt"), tzone = ""), End = structure(c(1357110430, 1357365312, 1357564413, 1358230679, 1357978810, 1358674600, 1358853933, 1359531923, 1359568151), class = c("POSIXct", "POSIXt"), tzone = ""), Interval = c(1206.16666666667, 2403.96666666667, 3246.15, 6608.48333333333, 1089.96666666667, 8713.95, 2704.3, 12375.2, 495.85)), .Names = c("ID", "Line", "Start", "End", "Interval"), row.names = c(NA, -9L), class = "data.frame") 

Al reproducir el dataframe de ejemplo y probarlo encontré una forma de obtener el resultado necesario:

  1. Solicitar datos por columnas relevantes (ID, inicio)

    ordered_data <- data[order(data$ID, data$Start),]

  2. Encuentra la primera fila para cada ID nueva

    final <- ordered_data[!duplicated(ordered_data$ID),]

Como no proporciona ningún dato, aquí hay un ejemplo que usa la base R con un dataframe de muestra:

 df <- data.frame(group=c("a", "b"), value=1:8) ## Order the data frame with the variable of interest df <- df[order(df$value),] ## Aggregate aggregate(df, list(df$group), FUN=head, 1) 

EDITAR: Como Ananda sugiere en su comentario, la siguiente llamada para aggregate es mejor:

 aggregate(.~group, df, FUN=head, 1) 

Si prefiere usar plyr , puede reemplazar aggregate con ddply :

 ddply(df, "group", head, 1)