代码之家  ›  专栏  ›  技术社区  ›  andrewj

as.数据帧以总结频率

  •  4
  • andrewj  · 技术社区  · 16 年前

    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
    

    我遇到的问题是 x y ,它开始占用大量内存>64 GB。我想知道有没有其他方法可以做这种频率计数。作为第一步,我 stringsAsFactors=F

    3 回复  |  直到 9 年前
        1
  •  4
  •   Collin    16 年前

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

    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
  •  1
  •   Jonathan Chang    16 年前

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

        3
  •  1
  •   Ian Fellows    16 年前
    library(plyr)
    ddply(foo, ~ x + y, nrow,.drop=FALSE)