【发布时间】: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 <- DF[!(duplicated(DF$TIME) & duplicated(DF$AIR)) & duplicated(DF$DATE),] 无济于事。因此,它可能需要稍微复杂一些的东西——或者至少超出我目前的能力。谁能建议我需要做什么才能以这种方式分别考虑每一天?非常感谢!
请注意,实际上TIME 可能是重复的,但AIR 不是;这就是为什么我必须只删除那些 TIME 和 AIR 重复的条目。
【问题讨论】:
-
如果您的数据中没有任何其他列,您可以使用
unique(DF) -
不幸的是,我的完整数据集大约有 104 列
-
在这种情况下,如果是前 3 列,您可以使用
DF[!duplicated(DF[,1:3]),]。或者,您可以指定列名的字符向量来替换1:3。 -
除了我想保留重复的
DATE,而不是TIME和AIR。但是@Sotos 的答案已经奏效了,不过还是谢谢! -
它产生的结果与@Sotos 的结果相同,除了 row.names (因为 dplyr)
标签: r duplicates