【问题标题】:Count Occurrences of All Integers in Matrix计算矩阵中所有整数的出现次数
【发布时间】:2015-12-17 15:50:01
【问题描述】:

我有一个包含 20,000 行和 300 列的数组。每个元素都是一个整数。我想计算这个矩阵中每个整数的出现次数。

我尝试了以下方法:

 >frequency_Table=read.csv('huge_file.csv',header=FALSE,check.names=FALSE)
 >table(frequency_Table)

我收到错误消息“尝试使用 >= 2^31 个元素制作表格”,阅读后这很有意义。

我想要这样的东西:

1        2000
2        2023
3        5683

基本上,所有数字的频率表。任何建议将不胜感激!

【问题讨论】:

  • 为什么这个问题被标记为 Python?
  • 您实际上是在执行table(column1,column2,column3,column4,column5,etc,etc),如果您先在较小的桌子上尝试此操作,您很快就会发现这一点。这就是在 Stackoverflow 上发布之前尝试创建一个最小示例的价值 - 您经常在尝试整理问题的过程中找到答案。
  • 我实际上是无意中包含了python,对此感到抱歉。但是 Python 的答案也可以。

标签: r


【解决方案1】:

“频率表”对象是data.frame。我们unlist(假设 OP 想要一个 R 解决方案,因为使用 R 语法读取数据集)它创建一个 vector,然后使用 table 获得频率

as.data.frame(table(unlist(frequency_table)))

数据

set.seed(24)
frequency_table <- as.data.frame(matrix(sample(22:29, 20*4, 
          replace=TRUE), ncol=4))

【讨论】:

    【解决方案2】:
    from collections import Counter
    from numpy import np
    
    Counter(np.array(frequency_Table).flatten())
    

    【讨论】:

    • 您已将问题标记为 Python 和 R。我的答案是 Python。但是再次查看您的语法,在我看来您的代码在 R 中。
    【解决方案3】:

    numpy.unique 可以这样做:

    >>> import numpy as np
    >>> table = np.array([[1, 2, 3], [2, 2, 3], [3, 2, 3]])
    >>> values, counts = np.unique(table, return_counts = True)
    >>> for value, count in zip(values, counts):
    ...     print("{}\t{}".format(value, count))
    ...
    1       1
    2       4
    3       4
    

    【讨论】:

      【解决方案4】:

      你能找到一种快速获取 data.fame 中所有唯一整数的方法吗? 我的想法是,在你找出 data.frame 中的唯一整数之后。您可以使用代码sapply(unique_int, function(x) sum(m == x)) 找出每个整数对应的出现次数。

      这是我试过的代码:

      m <- matrix(sample(1:10, size=20000*300, replace=TRUE), ncol=300)
      #A way to get the unique integers
      unique_int <- unique(c(m))
      
      #Count
      count <- sapply(unique_int, function(x) sum(m == x))
      
      names(count) <- unique_int
      count
      
      ## 10      8      3      9      6      5      4      1      2      7 
      ## 598551 600413 599396 599517 600114 600503 601311 601205 599268 599722
      

      【讨论】:

      • 从@akrun 的回复中,您可以尝试unique(unlist(your_dataframe)) 获取唯一整数。
      【解决方案5】:

      这里是 R 中的 1 行解决方案: 您可以使用 stack() 或 unlist 将数据集的所有列排列为一个。基于此,您可以将堆叠数据集的第一列定义为因子,并使用带有长度的 tapply 作为函数,它可以为您提供每个元素的频率:

      使用堆栈():

      tapply(stack(frequency_Table)[,1],factor(stack(frequency_Table)[,1]),length)
      

      使用非列表:

      tapply(unlist(frequency_Table),factor(unlist(frequency_Table)),length)
      

      【讨论】:

        猜你喜欢
        • 2020-11-08
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 2020-10-25
        • 2018-10-05
        • 1970-01-01
        • 2011-09-09
        相关资源
        最近更新 更多