2012-07-03 32 views
2

duplicated()給出TRUEFALSE聲明取決於該位置是否先前在向量中重複。如果我不想刪除重複的位置,而且還想刪除以前與之相同的位置。刪除任何重複項及其對

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

a包含將被複制和b包含a值和不重複一些其他值的所有值。

我該如何提取"D"

+0

'unique' should do it。 – Andrie

+0

你的代碼示例(帶有兩個向量並且沒有明確用於'duplicateated()')似乎不符合你的描述(它指的是它中的「vector」和「previous position [s]」)。您的示例是否需要更新/更正? –

+0

@ JoshO'Brien,不,我認爲這個問題很好,但如果你認爲你可以更好地解釋,隨意編輯。如果使用了'c(a,b)[!duplicated(c(a,b))]',那麼它會輸出'[1]「A」「B」「C」「D」 ,b)[重複(c(a,b))]],則會輸出'[1]「A」「B」「C」'。我只需要''D「'返回。 我會編輯這個問題來說,'但也**所有**以前的位置,它是重複的。' – Kevin

回答

9

這裏是另一個問題:

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

我懷疑原始海報沒有'a'和'b'作爲單獨的列表。如果是這樣,你的優雅的解決方案將不適用於這種情況。 – bdemarest

+0

在原始海報提供的例子中,創建了兩個向量('a'和'b'),或者我錯過了什麼? – johannes

+0

@jmsigner,它對我的​​例子很好。 – Kevin

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" 
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" 
+0

這樣就把字符數據變成頻率表,然後提取只有1個頻率的列名。非常聰明。你認爲這可以通過向量中的數百或數千個字符數據輕鬆擴展嗎? – Kevin

+0

@Kev,正如@bdemarest所顯示的那樣,它對大數據速度很慢。 'table'需要很多時間爲您的案例生成無用的信息。 – cogitovita

3

這裏有一些計時顯示張貼@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  
+0

什麼是y?它在你的例子中是未定義的。 – Kevin

+0

'y'應該是'a'。現在糾正了。謝謝! – bdemarest