duplicated()
给出TRUE
或FALSE
声明取决于该位置是否在向量中先前重复。如果我不仅要删除重复的位置,还要删除它重复的所有先前位置怎么办。
a <- c("A", "B", "C")
b <- c("A", "B", "C", "D")
a
包含所有将被复制的值,并b
包含 的值a
和其他一些不被复制的值。
我如何只提取"D"
?
duplicated()
给出TRUE
或FALSE
声明取决于该位置是否在向量中先前重复。如果我不仅要删除重复的位置,还要删除它重复的所有先前位置怎么办。
a <- c("A", "B", "C")
b <- c("A", "B", "C", "D")
a
包含所有将被复制的值,并b
包含 的值a
和其他一些不被复制的值。
我如何只提取"D"
?
这是另一个:
b[!b %in% a]
[1] "D"
如果你真正拥有的是一个单一的向量,其中一些元素是重复的,而一些(你想保留的)不是,你可以尝试以下任何一种:
## 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"
以下是展示@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
> table(c(a, b))
# A B C D
# 2 2 2 1
> names(table(c(a, b)))[table(c(a, b)) == 1]
# [1] "D"