R语言 根据一列的条件删除另一列中重复的行

csga3l58  于 2023-02-01  发布在  其他
关注(0)|答案(7)|浏览(277)

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

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

我想删除重复的行,这样我只有一个日期行,我想这样做的基础上的深度,我想保留行与最大(最深)的深度。任何想法?

nqwrtyyt

nqwrtyyt1#

假设您有df格式的数据

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

3bygqnnd2#

这里有一种方法可以在一个dplyr调用中实现:

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

30byixjq3#

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

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

只是另一种方式:

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

yqlxgs2m4#

如果你的数据框很大,这可能不是最快的方法,但是一个相当直接的方法。这可能会改变你的数据框的顺序,你可能需要重新排序,例如日期。我们不是删除,而是按日期分割数据,在每个块中选择一行最大的日期,最后将结果加入到数据框中

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

yacmzcpb5#

你也可以用dplyr的arrange()来代替order(我觉得这样更直观):

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

ca1c2owp6#

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

这对你有用吗?

pftdvrlh

pftdvrlh7#

使用dplyr的distinct函数的替代方法:

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

相关问题