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"
?
如果你真的是在一些元素被複制一個載體和一些(你想保持)都沒有,你可以嘗試以下任一:
## 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"
> table(c(a, b))
# A B C D
# 2 2 2 1
> names(table(c(a, b)))[table(c(a, b)) == 1]
# [1] "D"
這樣就把字符數據變成頻率表,然後提取只有1個頻率的列名。非常聰明。你認爲這可以通過向量中的數百或數千個字符數據輕鬆擴展嗎? – Kevin
@Kev,正如@bdemarest所顯示的那樣,它對大數據速度很慢。 'table'需要很多時間爲您的案例生成無用的信息。 – cogitovita
這裏有一些計時顯示張貼@Josh奧布萊恩,@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
'unique' should do it。 – Andrie
你的代碼示例(帶有兩個向量並且沒有明確用於'duplicateated()')似乎不符合你的描述(它指的是它中的「vector」和「previous position [s]」)。您的示例是否需要更新/更正? –
@ JoshO'Brien,不,我認爲這個問題很好,但如果你認爲你可以更好地解釋,隨意編輯。如果使用了'c(a,b)[!duplicated(c(a,b))]',那麼它會輸出'[1]「A」「B」「C」「D」 ,b)[重複(c(a,b))]],則會輸出'[1]「A」「B」「C」'。我只需要''D「'返回。 我會編輯這個問題來說,'但也**所有**以前的位置,它是重複的。' – Kevin