【问题标题】:Remove duplicates based on some conditions根据某些条件删除重复项
【发布时间】:2020-03-17 03:51:35
【问题描述】:

我有两个数据集:D1 和 D2。 D2 是 D1 的左连接,是一个更大的数据集,我将其称为 D3。虽然 D2 的键列具有与 D1 相同数量的唯一元素,但它有一些重复项,我想根据某些条件删除。 p>

有两个问题:

1)有一些行全是NA值,除了键值,这些行对我来说很重要。

2)还有一些其他行可能重复也可能不重复,但与我的标准条件不匹配。

如何根据层次结构有条件地删除这些重复项?

样本数据集:

ID  Var
1   1
2   1
3   1
3   9
4   2
4   9
5   1
6   1
7   1
7   9
7   9
8   2
9  
10  1

预期数据集:

ID  Var
1   1
2   1
3   1
4   2
5   1
6   1
7   1
8   2
9  
10  1

【问题讨论】:

  • 您要选择每组的第一行吗? df %>% group_by(ID) %>% slice(1L) ?
  • duplicated 也适用于单列。
  • 我没有识别重复的问题,我的问题是一旦识别就处理重复。
  • (1) 您对 D1 和 D2 等的讨论似乎是多余且令人困惑的。如果有多个表是相关的,那么......请提供多个表以及为什么我们需要它们来显示加入它们的作用的上下文。 (2) “可能被复制也可能不被复制” 听起来……很软。你的“标准条件”是什么?触发或停止删除需要哪些非重复条件?

标签: r dplyr tidyr


【解决方案1】:

duplicated 满足您的需求。

dat[!duplicated(dat$ID),]
#    ID Var
# 1   1   1
# 2   2   1
# 3   3   1
# 5   4   2
# 7   5   1
# 8   6   1
# 9   7   1
# 12  8   2
# 13  9  NA
# 14 10   1

就像 tidyverse 中的某些东西一样:

library(dplyr)
dat %>%
  group_by(ID) %>%
  slice(1) %>%
  ungroup()

还有data.table ...

library(data.table)
as.data.table(dat)[ !duplicated(ID), ]

数据:

dat <- read.table(header = TRUE, text = "
ID  Var
1   1
2   1
3   1
3   9
4   2
4   9
5   1
6   1
7   1
7   9
7   9
8   2
9   NA
10  1")

【讨论】:

    【解决方案2】:

    让我们说!我们在下面有一个 data.table:

    Library(data.table)
     df <- data.table(Name = c("JACK", "JOHN", "JACK", "ANNIE", "JOHN", "JACK"), 
                      Amount = c(30, 10, 20, 24, 5, 1))
    

    在这种情况下,我按名称排序,因此它与您的 Id 列相似。当我得到适当的订单时,我会只取第一个结果

    df[][order(Name, Amount)]
    df[,.SD[1], by = Name]
    

    输出:

        Name Amount
    1:  JACK     30
    2:  JOHN     10
    3: ANNIE     24
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多