2013-10-11 39 views
-4

我試圖從任何整數向量中刪除重複的元素,但沒有內置函數:duplicated(),unique()anyDuplicated()。結果必須與unique()的結果相同。R - 擺脫向量中的重複元素

到目前爲止,我設法從遞增的順序獲得矢量值(這不夠好)。我做了(對於給定向量)如下:

vec <- c(1,2,2,4,1,1,5,6,3,9,0,4)

我可以用vec <- sort(vec)然後rle(vec)$val獲得值的向量遞增的順序。我還試圖通過sort(vec,index.return=TRUE)$ix從排序函數中獲得排序向量,並使用該向量來將此排序應用於result向量(但由於result短於vec,因此它是不可能的)。

任何想法如何解決這個問題?在此先感謝

+2

呵呵?你爲什麼不想使用這些功能? – eddi

+1

好的,但爲什麼不使用內置函數?這只是爲了好玩嗎?否則,知道這個看似奇怪的請求的需要將有助於提供有用的答案。 – Aaron

+0

是的,這是我從老師那裏收到的一項具有挑戰性的任務。此外使用函數,循環和if-else語句也不允許**。忘記提及。 – user2871983

回答

3

你可以這樣做:

> vec[match(vec, vec) == seq_along(vec)] 
# [1] 1 2 4 5 6 3 9 0 
+3

P.S.如果我從一開始就知道這是一項家庭作業,我寧願不回答。我想刪除我的答案,然後意識到1)OP已經有機會看到我的答案2)如果我讓我的答案可見並且說老師在這裏找到答案,他會知道這不是OP的工作。所以...我在這裏離開我的答案。 – flodel

+0

這是很好的解決方案,但我不打算使用它,因爲它對我來說並不完全清楚。我仍然更喜歡我的方法完成。我想有人會給我一些提示如何進一步,但似乎我錯了。抱歉,添麻煩了。 – user2871983

+0

@ flodel你是老師嗎?這真的很酷,我必須運行每一點來包圍我的頭,它是如何工作的。好一個。 –

0

如何做事的不自然的方式...

> vec[rank(vec,t="first")==rank(vec,t="min")] 
[1] 1 2 4 5 6 3 9 0 
> vec[{o<-outer(vec,vec,"-");rowSums((o==0) * (row(o)>col(o)))==0}] 
[1] 1 2 4 5 6 3 9 0 
> vec[!mapply("%in%",vec,lapply(seq_along(vec),function(x) head(vec,x-1)))] 
[1] 1 2 4 5 6 3 9 0 
0

我覺得很簡單的解決方案。它足以執行: union(vec,vec)