获取恰好出现 n 次的值

Posted

技术标签:

【中文标题】获取恰好出现 n 次的值【英文标题】:Getting values that appear exactly n-times 【发布时间】:2014-11-25 06:07:45 【问题描述】:

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

【问题讨论】:

很多好的答案。谢谢! 我认为在所有建议的答案中,您的table 是最不笨拙的一个。高效,代码更少,无需外部包。 【参考方案1】:

您可以对值进行排序,然后使用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】:

你也可以在基础 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

【讨论】:

【参考方案3】:

这里的单衬完全没有必要,但单衬总是很好

假设您想找出所有发生 2 次的元素。使用plyr 包:

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

【讨论】:

count...我们认识他吗?【参考方案4】:

对于 n=1,您可以使用 duplicated,只需调用它两次并使用 fromLast 参数。

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

【讨论】:

【参考方案5】:

我更喜欢其他答案,但这似乎是用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

【讨论】:

以上是关于获取恰好出现 n 次的值的主要内容,如果未能解决你的问题,请参考以下文章

找到恰好出现三次的元素

hdu-6194 string string string 后缀数组 出现恰好K次的串的数量

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

[luoguU42591]

[HAOI2018]染色

算法题1 数组中唯一出现1次的数|唯一出现2次的数