【问题标题】:Removing duplicates based on a specific category of another column根据另一列的特定类别删除重复项
【发布时间】:2021-06-30 01:57:38
【问题描述】:

我想使用Category 列在我的数据中删除重复的IDs。我的数据子集如下:

df <- data.frame(ID=c(1,2,3,4,1,4,2),
                 category=c("a","b","c","d","b","a","a"))
df

  ID category
1  1        a
2  2        b
3  3        c
4  4        d
5  1        b
6  4        a
7  2        a

如果Category b中存在重复的ID,我需要保留它并从其他类别中删除相应的ID。而且,如果重复的IDs 是除Category b 之外的其他类别,我没有优先权。所以,我最喜欢的结果是:

  ID category
1  2        b
2  3        c
3  4        d
4  1        b

我已经阅读了这篇文章:R: Remove duplicates from a dataframe based on categories in a column 但找不到我的答案

【问题讨论】:

  • @Cihan,你有什么想法吗?
  • @akrun,谢谢!是的,当两个类别中的一个是 b 的 ID 重复时,类别 b 是有意义的。否则,没有删除重复 ID 的偏好
  • @akrun,谢谢!我正在运行您的解决方案。它在样本数据上工作,但在真实数据上,它只返回与类别 b 对应的行,而所有其他行都被删除。
  • 我明白了。请检查我的更新。您不需要任何过滤
  • @akrun,谢谢,它正在工作

标签: r dplyr duplicates


【解决方案1】:

我们可以对'b'类别行排列在顶部执行arrange,然后通过'ID'获取distinct

library(dplyr)
df %>%
     arrange(category != 'b') %>% 
     distinct(ID, .keep_all = TRUE)

-输出

  ID category
1  2        b
2  1        b
3  3        c
4  4        d

或使用base R

df[order(df$category != 'b'), ] -> df1
df1[!duplicated(df1$ID), ]

【讨论】:

    【解决方案2】:

    在基础 R 中你可以这样做:

     subset(df, !category %in% category[ID %in% ID[category == 'b'] & category !='b'])
      ID category
    1  2        b
    2  3        c
    3  4        d
    4  1        b
    

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 2018-05-27
      • 2015-04-20
      • 1970-01-01
      • 2022-01-23
      • 2014-03-14
      相关资源
      最近更新 更多