Voici un exemple de mon ensemble de données;
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
Je souhaite supprimer les lignes en double afin que je ne dispose que d'une ligne par date. Je souhaite le faire en fonction de la profondeur. Je souhaite conserver la ligne avec la profondeur maximale. Des idées?
Disons que vous avez des données en df
df = df[order(df[,'Date'],-df[,'Depth']),]
df = df[!duplicated(df$Date),]
Ce n'est peut-être pas l'approche la plus rapide si votre bloc de données est volumineux, mais plutôt assez simple. Cela pourrait changer l'ordre de votre trame de données et vous pourriez avoir besoin de réorganiser par exemple. date après. Au lieu de supprimer, nous scindons les données par date, dans chaque bloc, sélectionnons une ligne avec la date maximale et relions le résultat dans un bloc de données.
data = split(data, data$Date)
data = lapply(data, function(x) x[which.max(x$Depth), , drop=FALSE])
data = do.call("rbind", data)
Présentation d'une solution data.table
qui sera le moyen le plus rapide de résoudre ce problème (en supposant que data
est votre ensemble de données)
library(data.table)
unique(setDT(data)[order(Date, -Depth)], by = "Date")
Juste un autre moyen:
setDT(data)[data[, .I[which.max(Depth)], by=Date]$V1]
# 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]))),]
Est-ce que ça marche pour toi?
Vous pouvez également utiliser la fonction arrange()
de dplyr à la place de order (je la trouve plus intuitive):
df <- arrange(df, Date, -Depth)
df <- df[!duplicated(df$Date),]