获得恰好n次出现的值

时间:2014-09-30 14:48:34

标签: r contingency

我特意开始思考这个问题,试图将值形成一个不重复的向量。 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以外的其他值。但我发现这个解决方案有点笨拙,将字符串转换为数字。获得此向量是否有更好或更直接的方法?

5 个答案:

答案 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

我已经使用factorlevels来使方法更加通用(因此&#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