我特意开始思考这个问题,试图将值形成一个不重复的向量。 unique
不好(取决于我从文档中收集的内容),因为它为您提供了重复的元素,但只提供了一次。 duplicated
具有相同的问题,因为它在第一次找到重复的值时会给你FALSE。这是我的解决方法
> 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以外的其他值。但我发现这个解决方案有点笨拙,将字符串转换为数字。获得此向量是否有更好或更直接的方法?
答案 0 :(得分: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
答案 1 :(得分:2)
这里的单线是完全没必要的,但单线总是很好
假设您要查找发生2次的所有元素。使用plyr
包:
count(d)$x[count(d)$freq==2]
#Output
#[1] 3 4
答案 2 :(得分:2)
你也可以在基地R做这样的事。
as.numeric(levels(factor(d))[tabulate(factor(d)) == 1])
# [1] 1 2 5 6 7 8 10
我已经使用factor
和levels
来使方法更加通用(因此&#34; d&#34;可以包含负值和0)。
当然,即使对于这样的事情,你也可以期待来自&#34; data.table&#34;的性能提升,你可以用它来做:
library(data.table)
as.data.table(d)[, .N, by = d][N == 1]$d
# [1] 1 2 6 7 8 5 10
答案 3 :(得分:1)
您可以将duplicated
用于n = 1,只需调用两次并使用fromLast
参数。
sort(d[! (duplicated(d) | duplicated(d, fromLast=TRUE))])
# [1] 1 2 5 6 7 8 10
答案 4 :(得分: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