获取恰好出现 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
我使用factor
和levels
使方法更通用(因此“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次的串的数量