【问题标题】:Removal of duplicates from specific columns/rows only仅从特定列/行中删除重复项
【发布时间】:2016-09-09 14:21:51
【问题描述】:

我有一个包含大量重复 TIME 和 AIR 数据条目的数据集。我需要删除所有包含这些条目的行。这本身就非常简单:

DATE <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3) 
    #Supposed to be 4 entries per date; day 1 has 1 entry too many, day 2 has 2 entries too many
TIME <- c(0,3,3,6,9,0,0,3,6,9,9,0,3,6,9) 
    #Samples are taken every 3 hours from 0-9 each day
AIR <- c(1.1, 1.2, 1.2, 1.3, 1.4, 1.1, 1.1, 1.2, 1.3, 1.4, 1.4, 1.1, 1.2, 1.3, 1.4)

DF <- data.frame(DATE, TIME, AIR)

DF1 <- DF[!(duplicated(DF$TIME) & duplicated(DF$AIR)),]

DF1 将输出以下内容:

  DATE TIME AIR
1    1    0 1.1
2    1    3 1.2
4    1    6 1.3
5    1    9 1.4

但是,我需要单独考虑每一天或 DATE,我实际寻找的输出是:

DATE TIME AIR
1   0   1.1
1   3   1.2
1   6   1.3
1   9   1.4
2   0   1.1
2   3   1.2
2   6   1.3
2   9   1.4
3   0   1.1
3   3   1.2
3   6   1.3
3   9   1.4

在这种情况下,复制会在每一天停止。我认为这就像稍微修改我的代码一样简单,但事实证明并非如此,我尝试了许多变体:DF2 &lt;- DF[!(duplicated(DF$TIME) &amp; duplicated(DF$AIR)) &amp; duplicated(DF$DATE),] 无济于事。因此,它可能需要稍微复杂一些的东西——或者至少超出我目前的能力。谁能建议我需要做什么才能以这种方式分别考虑每一天?非常感谢!

请注意,实际上TIME 可能是重复的,但AIR 不是;这就是为什么我必须只删除那些 TIMEAIR 重复的条目。

【问题讨论】:

  • 如果您的数据中没有任何其他列,您可以使用unique(DF)
  • 不幸的是,我的完整数据集大约有 104 列
  • 在这种情况下,如果是前 3 列,您可以使用 DF[!duplicated(DF[,1:3]),]。或者,您可以指定列名的字符向量来替换 1:3
  • 除了我想保留重复的DATE,而不是TIMEAIR。但是@Sotos 的答案已经奏效了,不过还是谢谢!
  • 它产生的结果与@Sotos 的结果相同,除了 row.names (因为 dplyr)

标签: r duplicates


【解决方案1】:

您需要分组,即(与dplyr

library(dplyr)
DF %>% 
  group_by(DATE) %>% 
  filter(!(duplicated(TIME) & duplicated(AIR))

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2020-12-01
    • 2018-05-13
    • 2017-11-26
    • 2021-11-27
    相关资源
    最近更新 更多