根据另一列的条件删除其中一个列中重复的行

59

这是我的数据集的一个示例:

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

我想删除重复的行,以便每个日期只保留一行,我希望根据深度进行此操作,并且保留深度最大(最深)的行。有什么建议吗?

7个回答

92

假设您有一个数据框df。

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

1
优雅,比我的好多了。+1 - Oleg Sklyar
1
你可能应该将 duplicated[df$Date] 切换为 duplicated(df$Date)。除此之外,这是这里唯一真正的 R 解决方案。 - David Arenburg

20

以下是使用单个dplyr调用的一种方法:

# Remove any duplicates
df <- df %>%
  arrange(Date, -Depth) %>%
  filter(duplicated(Date) == FALSE)

2
很好。我更喜欢使用!duplicated(Date)而不是duplicated(Date) == FALSE - Stefan Jelkovich

11

介绍一个data.table的解决方案,这将是最快的解决方法(假设data是你的数据集)

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

另一种方式:

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

6
你也可以使用dplyr的arrange()代替order(我认为这更直观):
df <- arrange(df, Date, -Depth)
df <- df[!duplicated(df$Date),]

4

如果你的数据框相对较大,这可能不是最快的方法,但非常直观。这可能会改变您的数据帧的顺序,您可能需要在之后按日期重新排序。我们不是删除数据,而是按日期拆分数据,在每个块中选择具有最大日期的行,最后将结果合并回数据框。

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

也许你可以用 by 替换 split+lapply - agstudy
我正在写一个类似于你的答案,但是你比我先完成了。我已经将helen.h的实际数据添加到你的帖子中,以便显示所需的输出。希望这样可以。 - Anders Ellern Bilgrau
@agstudy 我很想尝试一下,但是我现在所在的地方没有安装R :) - Oleg Sklyar

3
# 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

使用dplyr的distinct函数的另一种方法:

library(dplyr)
df %>% distinct(column, .keep_all = TRUE)

你的解决方案没有解决问题的第二部分(“...基于另一列的条件”)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接