web-dev-qa-db-ja.com

別の列の条件に基づいて、ある列で複製された行を削除する

これが私のデータセットの例です。

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行のみにするようにします。これは、深さに基づいて行います。最大(最も深い)深さの行を保持します。何か案は?

26
helen.h

Dfにデータがあるとしましょう

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

data.tableこれを解決する最速の方法になるソリューション(dataがデータセットであると仮定)

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

別の方法:

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

データフレームが大きい場合、これは最速のアプローチではないかもしれませんが、かなり率直なアプローチです。これにより、データフレームの順序が変更される可能性があります。たとえば、その後の日付。削除する代わりに、日付ごとにデータを分割し、各チャンクで最大日付の行を選択し、最終的に結果をデータフレームに結合します

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

それはあなたのために働きますか?

1
ThatGuy

順序の代わりにdplyrのarrange()を使用することもできます(より直感的にわかります)。

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