【问题标题】:Remove duplicate rows based on conditions from multiple columns (decreasing order) in R根据R中多列(递减顺序)的条件删除重复行
【发布时间】:2015-09-24 07:24:44
【问题描述】:

我有一个 3 列的 data.frame(变量:ID.AID.BDISTANCE)。我想在以下条件下删除重复项:将具有最小值的行保留在第 3 列中。

这与这里的问题相同: R, conditionally remove duplicate rows (类似:Remove duplicates based on 2nd column condition

但是,在我的情况下,还有第二个问题:当 情侣ID.AID.BDISTANCE)重复时,我必须删除行,而不仅仅是在 @ 987654330@重复了。

我尝试了几件事,例如:

df <- ddply(df, 1:3, function(df) return(df[df$DISTANCE==min(df$DISTANCE),]))

但是没用

例子:

这个数据集

    id.a id.b dist
1    1    1   12
2    1    1   10
3    1    1   8
4    2    1   20
5    1    1   15
6    3    1   16

应该变成:

    id.a id.b dist
3    1    1   8
4    2    1   20
6    3    1   16

【问题讨论】:

  • 这是dplyr 的完美工作,但你的问题没有意义。 “保留第 3 列中的最小值”和“删除重复的三胞胎行”是什么意思?如果三元组重复,那么第 3 列中必然只有一个值吗?我错过了什么吗?
  • @Alex - 我假设 OP 表示对联 ID.A / ID.B,但他们应该澄清一下。
  • 我添加了一个例子。 @thelatermail 你是对的,不清楚,这是一对 ID.A / ID.B,第 3 列有条件
  • 我很确定这是其中一个链接查询的副本 - 您可以先运行 order 操作以获得您想要的 dat &lt;- dat[do.call(order, dat),]; dat[!duplicated(dat[1:2]),]

标签: r dataframe duplicates conditional-statements plyr


【解决方案1】:

使用dplyr,并对Remove duplicated rows using dplyr进行适当修改

library(dplyr)

df %>%
group_by(id.a, id.b) %>%
arrange(dist) %>% # in each group, arrange in ascending order by distance
filter(row_number() == 1)

【讨论】:

  • 为什么不使用distinct()df %&gt;% group_by(id.a, id.b) %&gt;% arrange(dist) %&gt;% distinct
  • 我不知道怎么用distinct
  • 好吧,我想现在你知道了 :)
  • 我觉得distinct 相当混乱,因为帮助文件并没有真正解释它如何处理分组数据帧。
  • @Alex 如果对数据框进行分组,则distinct 只需在每个组中查找不同的条目。
【解决方案2】:

实现解决方案并保留所有列的另一种方法:

df %>% arrange(dist) %>% 
  distinct(id.a, id.b, .keep_all=TRUE)

#   id.a id.b dist
# 1    1    1    8
# 2    3    1   16
# 3    2    1   20

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 2017-09-12
    • 2023-02-14
    • 2020-06-10
    • 2020-07-15
    • 1970-01-01
    • 2019-02-13
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多