He aquí un ejemplo de mi conjunto de datos;

Date      Time(GMT)Depth Temp  Salinity Density Phosphate
24/06/2002  1000    1           33.855          0.01
24/06/2002  1000    45          33.827          0.01
01/07/2002  1000    10  13.26   33.104  24.873  0.06
01/07/2002  1000    30  12.01   33.787  25.646  0.13
08/07/2002  1000    5   13.34   33.609  25.248  0.01
08/07/2002  1000    40  12.01   34.258  26.011  1.33
15/07/2002  1000    30  12.04   34.507  26.199  0.01
22/07/2002  1000    5   13.93   33.792  25.269  0.01
22/07/2002  1000    30  11.9    34.438  26.172  0.08
29/07/2002  1000    5   13.23   34.09   25.642  0.01

Quiero eliminar filas duplicadas por lo que sólo tiene una fila por cada fecha, yo quiero hacer esto basado en la Profundidad, me gustaría mantener la fila con el más grande (más profundo) de profundidad. Alguna idea?

OriginalEl autor helen.h | 2014-06-03

5 Comentarios

  1. 42

    Digamos que usted tiene datos en el df

    df = df[order(df[,'Date'],-df[,'Depth']),]
    df = df[!duplicated(df$Date),]
    Elegante, mucho mejor que a mi. +1
    Probablemente debería cambiar duplicated[df$Date] a duplicated(df$Date). Aparte de eso, este es el único real R solución aquí
    Que fue error de escritura… Cambió de a ()…
    Sé que era, por eso me upvoted es

    OriginalEl autor vrajs5

  2. 4

    La introducción de un data.table solución que será la forma más rápida de resolver este (suponiendo data es el conjunto de datos)

    library(data.table)
    unique(setDT(data)[order(Date, -Depth)], by = "Date")

    Sólo otra manera:

    setDT(data)[data[, .I[which.max(Depth)], by=Date]$V1]
    De hecho! ¿Cómo puedo olvidar de datos.tablas…. +1

    OriginalEl autor David Arenburg

  3. 3

    Este no puede ser el enfoque más rápido si el marco de datos es grande, pero bastante strightforward uno. Esto podría cambiar el orden de su marco de datos y usted puede ser que necesite para reordenar, por ejemplo, por fecha después. En lugar de eliminar hemos dividido los datos por fecha, en cada fragmento de selección de una fila con la fecha máxima y, finalmente, unirse a el resultado en un marco de datos

    data = split(data, data$Date)
    data = lapply(data, function(x) x[which.max(x$Depth), , drop=FALSE])
    data = do.call("rbind", data)
    tal vez usted puede reemplazar split+lapply por by.
    Yo estaba escribiendo una respuesta similar a la tuya, pero me pegaba a él. He añadido helen.h los datos reales de tu post así que la salida deseada se muestra. Espero que bien.
    Me encantaría, pero no tienen R instalado donde estoy ahora a probarlo 🙂
    Aunque personalmente prefiero la solución por @vrajs5 …

    OriginalEl autor Oleg Sklyar

  4. 1
    # First find the maxvalues
    maxvals = aggregate(df$Depth~df$Date, FUN=max)
    #Now use apply to find the matching rows and separate them out
    out = df[apply(maxvals,1,FUN=function(x) which(paste(df$Date,df$Depth) == paste(x[1],x[2]))),]

    Hace ese trabajo por usted?

    OriginalEl autor ThatGuy

  5. 1

    También se pueden utilizar dplyr del arrange() en lugar de orden (me parece más intuitivo):

    df <- arrange(df, Date, -Depth)
    df <- df[!duplicated(df$Date),]

    OriginalEl autor Pablo Herreros Cantis

Dejar respuesta

Please enter your comment!
Please enter your name here