web-dev-qa-db-fra.com

Suppression des lignes dupliquées dans une colonne en fonction d'une autre colonne

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? 

19
helen.h

Disons que vous avez des données en df

df = df[order(df[,'Date'],-df[,'Depth']),]
df = df[!duplicated(df$Date),]
38
vrajs5

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)
3
Oleg Sklyar

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]
3
David Arenburg
# 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?

1
ThatGuy

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),]
1