as.data.frame of table() для суммирования частот

В 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, однако это не решает проблему полностью.


person andrewj    schedule 26.04.2010    source источник


Ответы (2)


У меня есть этот метод для быстрой (разреженной) перекрестной таблицы. Я думаю, что есть возможности для дальнейшей оптимизации, но мне этого достаточно для больших наборов данных. Ключевым моментом является использование 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)
}
person hadley    schedule 26.04.2010

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

person Jonathan Chang    schedule 26.04.2010
comment
Спасибо за предложение. Однако я думаю, что xtabs работает только с двусторонними таблицами. Оказывается, в моем конкретном случае у меня есть трехсторонняя таблица. - person andrewj; 27.04.2010