删除所有重复项及其对

时间:2012-07-03 06:04:37

标签: r

duplicated()会提供TRUEFALSE语句,具体取决于该位置先前是否在向量中重复。如果我不仅要删除重复的位置,而且还要删除它与之重复的所有先前位置,该怎么办。

a <- c("A", "B", "C")
b <- c("A", "B", "C", "D")

a包含将要复制的所有值,b包含a的值以及其他一些不重复的值。

如何仅提取"D"

4 个答案:

答案 0 :(得分:9)

这是另一个:

b[!b %in% a]
[1] "D"

答案 1 :(得分:4)

如果您真正拥有的是单个向量,其中某些元素是重复的,而某些元素(您想要保留)则不是,您可以尝试其中任何一个:

## Constructing an example that fits your narrative description of the situation
a <- c("A", "B", "C")
b <- c("A", "B", "C", "D")
ab <- c(a,b)

# Approach #1
setdiff(ab, ab[duplicated(ab)])
# [1] "D"

# Approach #2 
ab[!(duplicated(ab) | rev(duplicated(rev(ab))))] 
# [1] "D"

答案 2 :(得分:3)

以下是一些时间来展示@Josh O'Brien,@ cogitovita和@jmsigner发布的解决方案如何使用更大的数据集执行:

set.seed(123)

a = sample(paste("ID_", seq(1e6), sep=""))
b = sample(a, 9e5, replace=TRUE)
ab = sample(c(a, b))

system.time(res1 <- setdiff(ab, ab[duplicated(ab)]))
#   user  system elapsed 
#  1.543   0.030   1.563 

system.time(res2 <- ab[!(duplicated(ab) | rev(duplicated(rev(ab))))])
#   user  system elapsed 
#  0.537   0.042   0.575 

system.time(res3 <- names(table(ab))[table(ab) == 1])
#   user  system elapsed 
# 52.208   0.255  52.218 

system.time(b[!b %in% a])
#user  system elapsed 
#0.098   0.002   0.100 

setequal(res1, res2)
# [1] TRUE
setequal(res1, res3)
# [1] TRUE    

答案 3 :(得分:0)

> table(c(a, b))
# A B C D
# 2 2 2 1
> names(table(c(a, b)))[table(c(a, b)) == 1]
# [1] "D"