2014-09-30 85 views
4

我特意開始考慮在這個問題中試圖讓值形成一個不重複的向量。 unique是不好的(直到我可以從文檔中收集),因爲它給你重複的元素,但只有一次。 duplicated有同樣的問題,因爲它第一次發現一個重複的值時會給你提供FALSE。這是我的解決方法獲取正好出現n次的值

> d=c(1,2,4,3,4,6,7,8,5,10,3) 
> setdiff(d,unique(d[duplicated(d)])) 
[1] 1 2 6 7 8 5 10 

以下是較普遍的辦法

> table(d)->g 
> as.numeric(names(g[g==1])) 
[1] 1 2 5 6 7 8 10 

,我們可以推廣到1以外的其它值,但我發現這個解決方案有點笨拙,轉化字符串的數字。有沒有更好或更直接的方法來獲得這個矢量?

+1

很多好的答案。謝謝! – Enredanrestos 2014-09-30 15:12:47

+3

我認爲,在所有提出的答案中,你的「桌子」是最不笨的一個。高效,少代碼,無需外部軟件包。 – 2014-09-30 15:17:00

回答

4

您可以對值進行排序,然後使用rle獲取連續出現n次的值。

rl <- rle(sort(d)) 

rl$values[rl$lengths==1] 
## [1] 1 2 5 6 7 8 10 

rl$values[rl$lengths==2] 
## [1] 3 4 
2

可以使用duplicated n = 1時,只需撥打了兩次,並使用fromLast說法。

sort(d[! (duplicated(d) | duplicated(d, fromLast=TRUE))]) 
# [1] 1 2 5 6 7 8 10 
3

這裏的一個班輪是完全沒有必要的,但單行總是好的

說你想找到所有發生2次的元素。使用plyr包:

count(d)$x[count(d)$freq==2] 
#Output 
#[1] 3 4 
+3

嗯'count' ...我們認識他嗎? – 2014-09-30 15:11:38

+1

從'plyr'。我剛剛添加了一個編輯。 – 2014-09-30 15:12:31

+0

啊好抓,我只是習慣於使用它 – DMT 2014-09-30 15:12:51

1

我更喜歡其他的答案,但是這似乎是一個很好的藉口,與dplyr測試我的技巧:

library(dplyr) 
as.data.frame(table(d)) %>% 
    filter(Freq == 1) %>% 
    select(d) 
--- 
    d 
1 1 
2 2 
3 5 
4 6 
5 7 
6 8 
7 10 
2

你也可以做這樣的事情在基地R.

as.numeric(levels(factor(d))[tabulate(factor(d)) == 1]) 
# [1] 1 2 5 6 7 8 10 

我用factorlevels,使辦法更普遍的(所以「d」可以包括負值和0)。


當然,即使這樣的事情,你可以期望從「data.table」性能提升,使用它可以這樣做:

library(data.table) 
as.data.table(d)[, .N, by = d][N == 1]$d 
# [1] 1 2 6 7 8 5 10