这是我的数据集的示例;
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
我想删除重复的行,以便每个日期只有一行,我想根据深度执行此操作,我想保留具有最大(最深)深度的行。有什么想法吗?
假设您在 df 中有数据
df = df[order(df[,'Date'],-df[,'Depth']),]
df = df[!duplicated(df$Date),]
这是在单个 dplyr 调用中完成此操作的一种方法:
# Remove any duplicates
df <- df %>%
arrange(Date, -Depth) %>%
filter(duplicated(Date) == FALSE)
引入
data.table
解决方案,这将是解决此问题的最快方法(假设 data
是您的数据集)
library(data.table)
unique(setDT(data)[order(Date, -Depth)], by = "Date")
另一种方式:
setDT(data)[data[, .I[which.max(Depth)], by=Date]$V1]
你也可以使用 dplyr 的
arrange()
来代替 order(我觉得它更直观):
df <- arrange(df, Date, -Depth)
df <- df[!duplicated(df$Date),]
如果您的数据帧很大,这可能不是最快的方法,但这是一种相当简单的方法。这可能会改变数据框的顺序,并且您可能需要重新排序,例如之后的日期。我们不是删除数据,而是按日期分割数据,在每个块中选择具有最大日期的行,最后将结果连接回数据框
data = split(data, data$Date)
data = lapply(data, function(x) x[which.max(x$Depth), , drop=FALSE])
data = do.call("rbind", data)
# 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]))),]
这对你有用吗?
使用 dplyr 的
distinct
函数的替代方法:
library(dplyr)
df %>% distinct(column, .keep_all = TRUE)