Используя tapply, ave функции для ff векторов в R

Я пытаюсь использовать tapply, ave, ddply для создания статистики по группе переменных (возраст, пол). Я не смог успешно использовать вышеупомянутые команды R.

library("ff")
df <- as.ffdf(data.frame(a=c(1,1,1:3,1:5), b=c(10:1), c=(1:10)))
tapply(df$a, df$b, length)

Сообщение об ошибке, которое я получаю,

Error in as.vmode(value, vmode) : 
 argument "value" is missing, with no default

или

Error in byMean(df$b, df$a) : object 'index' not found
1 ответ

В настоящее время в ff_vectors, реализованном в пакете ff, нет аппликации или пр. Но вы можете использовать функциональность в ffbase. Давайте подробно рассмотрим некоторые более крупные данные

require(ffbase)
a <- ffrep.int(ff(1:100000), times=500) ## 50Mio records on disk - not in RAM
b <- ffrandom(n=length(a), rfun = runif)
c <- ffseq_len(length(a))
df <- ffdf(a = a, b = b, c = c) ## on disk
dim(df)

Для вашего простого метода агрегирования вы можете использовать binned_sum, для которого вы можете легко извлечь длину следующим образом. Отметьте, что binned_sum нуждается в объекте ff factor в бункере, который можно получить, выполнив as.character.ff, как показано.

df$groupbyfactor <- as.character(df$a)
agg <- binned_sum(x=df$b, bin=df$groupbyfactor, nbins = length(levels(df$groupbyfactor)))
head(agg)
agg[, "count"]

Для более сложных агрегатов вы можете использовать ffdfdply в ffbase. То, что я часто делаю, это объединить его с некоторыми операторами data.table, такими как:

require(data.table)
agg <- ffdfdply(df, split=df$groupbyfactor, FUN=function(x){
 x <- as.data.table(x)
 result <- x[, list(b.mean = mean(b), b.median = median(b), b.length = length(b), whatever = b[c == max(c)][1]), by = list(a)]
 result <- as.data.frame(result)
 result
})
class(agg)
aggg <- as.data.frame(agg) ## Puts the data in RAM!

Это поместит ваши данные в ОЗУ в куски групп разделенных элементов, на основе которых вы можете применить функцию, например, некоторые инструкции data.table, которые требуют, чтобы ваши данные были в ОЗУ. Результат всех фрагментов, на основе которых вы применили эту функцию, затем комбинируется в новом ffdf, чтобы вы могли использовать его или помещать в ОЗУ, если ваша RAM позволяет этот размер.

Размеры кусков контролируются методом getOption ( "ffbatchbytes" ). Поэтому, если у вас больше оперативной памяти, тем лучше, так как это позволит вам получать больше данных в каждом фрагменте оперативной памяти.

licensed under cc by-sa 3.0 with attribution.