【问题标题】:Getting values that appear exactly n-times获取恰好出现 n 次的值
【发布时间】: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 是最不笨拙的一个。高效,代码更少,无需外部包。

标签: r contingency


【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2018-09-20
          • 2012-12-07
          • 2013-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-04
          • 2021-12-12
          相关资源
          最近更新 更多