Удаление строк, которые дублируются в одном столбце на основе условий другого столбца

Вот пример моего набора данных;

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

Я хочу удалить повторяющиеся строки, чтобы у меня была только одна строка в дате, я хочу сделать это на основе глубины, я бы хотел сохранить строку с наибольшей глубиной. Есть идеи?

Ответы

Ответ 1

Допустим, у вас есть данные в df

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

Ответ 2

Это может быть не самый быстрый подход, если ваш фрейм данных большой, но довольно простой. Это может изменить порядок вашего фрейма данных, и вам может потребоваться изменить порядок, например, на дату позже. Вместо удаления мы разбиваем данные по дате, в каждом фрагменте выбираем строку с максимальной датой и, наконец, присоединяем результат обратно к кадру данных

data = split(data, data$Date)
data = lapply(data, function(x) x[which.max(x$Depth), , drop=FALSE])
data = do.call("rbind", data)

Ответ 3

Представляем решение data.table которое будет самым быстрым способом решить эту проблему (при условии, что data являются вашим набором данных)

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

Еще один способ:

setDT(data)[data[, .I[which.max(Depth)], by=Date]$V1]

Ответ 4

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

Это работает для вас?