as.data.frame таблицы () для суммирования частот - PullRequest
4 голосов
/ 26 апреля 2010

В 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 ГБ. Мне было интересно, есть ли альтернативный способ сделать такой подсчет частоты. В качестве первого шага я установил stringsAsFactors=F, однако это не полностью решает проблему.

Ответы [ 3 ]

4 голосов
/ 26 апреля 2010

У меня есть этот метод для быстрого (разреженного) перекрестного табулирования. Я думаю, что есть возможности для дальнейшей оптимизации, но она была достаточно хороша для больших наборов данных. Ключом является использование 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)
}
1 голос
/ 26 апреля 2010
library(plyr)
ddply(foo, ~ x + y, nrow,.drop=FALSE)
1 голос
/ 26 апреля 2010

Посмотрите на метод xtabs в пакете Matrix, который редко разбрасывает таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...