【问题标题】:as.data.frame of table() to summarize frequenciesas.data.frame of table() 总结频率
【发布时间】:2010-04-26 15:53:24
【问题描述】:

R 中,我正在寻找一种节省内存的方法来创建表格数据的摘要,如下所示。

data.framefoo 为例,我使用table() 进行汇总,然后使用as.data.frame() 获取频率计数。

foo <- data.frame(x= c('a', 'a', 'a', 'b', 'b', 'b'), y=c('ab', 'ac', 'ad', 'ae', 'fx', 'fy'))
bar <- as.data.frame(table(foo), stringsAsFactors=F)

这导致bar 的以下频率计数

   x  y Freq
1  a ab    1
2  b ab    0
3  a ac    1
4  b ac    0
5  a ad    1
6  b ad    0
7  a ae    0
8  b ae    1
9  a fx    0
10 b fx    1
11 a fy    0
12 b fy    1

我遇到的问题是当xy 有多个级别时,它开始占用大量>64 GB 的内存。我想知道是否有另一种方法来进行这种频率计数。作为第一步,我设置了stringsAsFactors=F,但这并不能完全解决问题。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我有这种快速(稀疏)交叉制表的方法。我认为有进一步优化的可能性,但对于大型数据集对我来说已经足够了。关键是使用plyr包中的ninteraction为每一行快速生成一个数字id。

    tab <- function(df, drop = TRUE) {
      id <- plyr::ninteraction(df)
      ord <- order(id)
    
      df <- df[ord, , drop = FALSE]
      id <- id[ord]
    
      freq <- rle(id)$lengths
      labels <- unrowname(df[cumsum(freq), , drop = FALSE])
    
      data.frame(labels, freq)
    }
    

    【讨论】:

      【解决方案2】:

      查看Matrix 包中的xtabs 方法,该方法执行稀疏交叉制表。

      【讨论】:

      • 感谢您的建议。但是,我认为xtabs 仅适用于双向表。事实证明,在我的具体情况下,我实际上有一个三向表。
      【解决方案3】:
      library(plyr)
      ddply(foo, ~ x + y, nrow,.drop=FALSE)
      

      【讨论】:

        猜你喜欢
        • 2019-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 2021-03-29
        • 1970-01-01
        • 2022-12-01
        相关资源
        最近更新 更多