首页 > 解决方案 > 删除(准)相同的行

问题描述

在下面的 data.df 中,我们看到第 2 行和第 3 行是相同的,只是第 4 行的平均值不同。

    iso3 dest   code year          uv       mean
1    ALB  AUT 490700 2002  14027.2433 427387.640
2    ALB  BGR 490700 2002   1215.5613  11886.494
3    ALB  BGR 490700 2002   1215.5613  11886.494
4    ALB  BGR 490700 2002   1215.5613  58069.405
5    ALB  BGR 843050 2002    677.9827   4272.176
6    ALB  BGR 851030 2002  31004.0946  32364.379
7    ALB  HRV 392329 2002   1410.0072   6970.930

有什么简单的方法可以自动找到这些相同的行吗?我发现这个主题似乎可以回答这个问题,但我不明白“重复()”是如何工作的......

我想要的是一个“简单”的命令,我可以在其中精确地逐行确定哪个列值应该是相同的。类似的东西:function(data.df, c(iso3, dest, code, year, uv, mean)) 找到完全相同的行并function(data.df, c(iso3, dest, code, year, uv))找到“准”相同的行......

在第一种情况下,预期的结果类似于:

2    ALB  BGR 490700 2002   1215.5613  11886.494
3    ALB  BGR 490700 2002   1215.5613  11886.494

在第二个中:

2    ALB  BGR 490700 2002   1215.5613  11886.494
3    ALB  BGR 490700 2002   1215.5613  11886.494
4    ALB  BGR 490700 2002   1215.5613  58069.405

任何想法?

标签: r

解决方案


我们可以编写一个函数,然后传递我们想要考虑的列。

get_duplicated_rows <- function(df, cols) {
  df[duplicated(df[cols]) | duplicated(df[cols], fromLast = TRUE), ]
}

get_duplicated_rows(df, c("iso3", "dest", "code", "year", "uv","mean"))

# iso3 dest   code year     uv  mean
#2  ALB  BGR 490700 2002 1215.6 11886
#3  ALB  BGR 490700 2002 1215.6 11886

get_duplicated_rows(df, c("iso3", "dest", "code", "year", "uv"))
#  iso3 dest   code year     uv  mean
#2  ALB  BGR 490700 2002 1215.6 11886
#3  ALB  BGR 490700 2002 1215.6 11886
#4  ALB  BGR 490700 2002 1215.6 58069

推荐阅读