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

hel*_*n.h 27 r date duplicate-removal

这是我的数据集的一个例子;

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
Run Code Online (Sandbox Code Playgroud)

我想删除重复的行,这样我每个日期只有一行,我想根据深度做这个,我想保持最深(最深)的行.有任何想法吗?

vra*_*js5 47

假设您有df中的数据

df = df[order(df[,'Date'],-df[,'Depth']),]
df = df[!duplicated(df$Date),]
Run Code Online (Sandbox Code Playgroud)

  • 您可能应该将“duplicate[df$Date]”切换为“duplicate(df$Date)”。除此之外,这是唯一真正的 R 解决方案 (2认同)

Rya*_*ley 7

这是在单个 dplyr 调用中执行此操作的一种方法:

# Remove any duplicates
df <- df %>%
  arrange(Date, -Depth) %>%
  filter(duplicated(Date) == FALSE)
Run Code Online (Sandbox Code Playgroud)

  • 好的。我更喜欢 `!duplicate(Date)` 而不是 `duplicate(Date) == FALSE`。 (2认同)

Pab*_*tis 6

您也可以使用 dplyrarrange()代替 order(我发现它更直观):

df <- arrange(df, Date, -Depth)
df <- df[!duplicated(df$Date),]
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 5

介绍一种data.table解决方案,这将是解决此问题的最快方法(假设data是您的数据集)

library(data.table)
unique(setDT(data)[order(Date, -Depth)], by = "Date")
Run Code Online (Sandbox Code Playgroud)

只是另一种方式:

setDT(data)[data[, .I[which.max(Depth)], by=Date]$V1]
Run Code Online (Sandbox Code Playgroud)