table()的as.data.frame用于汇总频率

时间:2010-04-26 15:53:25

标签: r dataframe

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

以我使用data.frame进行汇总的foo 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有多个级别时,它开始耗尽大量内存&gt; 64 GB。我想知道是否有另一种方法来进行这种频率计数。作为第一步,我设置stringsAsFactors=F,但这并不能完全解决问题。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

library(plyr)
ddply(foo, ~ x + y, nrow,.drop=FALSE)