4

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しましたが、これで問題が完全に解決するわけではありません。

4

3 に答える 3

4

高速(スパース)クロス集計にはこの方法があります。さらなる最適化の可能性はあると思いますが、大規模なデータ セットには十分です。重要なのは、ninteractionfromplyrパッケージを使用して、各行の数値 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)
}
于 2010-04-26T18:32:16.107 に答える
1

まばらなクロス集計を行うパッケージのxtabsメソッドを見てください。Matrix

于 2010-04-26T16:06:34.963 に答える
1
library(plyr)
ddply(foo, ~ x + y, nrow,.drop=FALSE)
于 2010-04-26T16:25:30.213 に答える