获取出现次数为 n 次的值

5

我开始思考这个问题,试图从一个向量中获取没有重复的值。根据我从文档中收集到的信息,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以外的其他值。但我觉得这种解决方案有点笨拙,需要将字符串转换为数字。是否有更好或更直接的方法来获取此向量?


1
很多好的答案。谢谢! - user4095160
3
在所有提供的答案中,我认为你的“表格”解决方案是最不笨拙的。它高效、代码量较少,不需要外部包。 - David Arenburg
5个回答

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

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

2

这里的一行代码完全是不必要的,但是一行代码总是很好。

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

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

3
嗯,count…我们认识他吗? - David Arenburg

1
你可以使用duplicated来计算n=1的情况,只需调用两次并使用fromLast参数。
sort(d[! (duplicated(d) | duplicated(d, fromLast=TRUE))])
# [1]  1  2  5  6  7  8 10

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接