Функциональность Data.table setDT в пакетах ff/ffbase R

Рассчитать столбец условных средних, в ff/ffbase пакетах. Я ищу функциональность в пакетах ff/ffbase, которые позволяют мне манипулировать данными, как показано ниже с пакетом data.table:

library(data.table)
irisdf <- as.data.table(iris)
class(irisdf)
#"ffdf"
irisdf[,  NewMean:= mean(Sepal.Length), Species] 

В ffbase есть функция для условного среднего, но она создает вектор длины числа классов в irisdf[,5]:

condMean(x = irisdf[,1], index = irisdf[,5], na.rm = FALSE)

, а не новый вектор длины nrow(irisdf).

Как предложил @BondedDust, ave(base) дает правильный вывод:

VectorOfMeans <- ave(irisdf[,1], irisdf[,5], FUN=mean)

Итак, последний вопрос: как добавить VectorOfMeans к irisdf, я пробовал ниже код, который работает:

irisdf=as.ffdf(iris)
VectorOfMeans <- as.ffdf(as.ff(ave(irisdf[,1], irisdf[,5], FUN=mean)))
irisdf <- cbind.ffdf2(df,VectorOfMeans )

с cbind.ffdf2 из SO ответа, но Я полагаю, что вопрос SO был о чем-то более конкретном, чем основной, и я полагаю, что есть более простой (быстрый) способ сделать это. Я хотел бы иметь возможность запускать bigglm.ff на полученном наборе данных (в примере irisdf), вы должны посмотреть на мой вопрос об объединении VectorOfMeans и irisdf в этом контексте (поскольку есть проблемы с физическими/виртуальными режимами хранения, которые я не понимаю в Детали).


person Qbik    schedule 08.02.2015    source источник
comment
Я не думаю, что ограничения машины и данных понятны. Существуют также методы присваивания, которые принимают i-аргумент. См. ?'[‹-.ff'` и ?'[<-.ffdf' на странице справки по функциям присваивания для таких объектов.   -  person IRTFM    schedule 08.02.2015
comment
@BondedDust да, есть даже condMean для условного среднего, но длина вывода - это количество классов, а не количество строк в наборе данных, а метки классов не рассматриваются как переменные.   -  person Qbik    schedule 08.02.2015
comment
В базе R это было бы проблемой для функции ave. Вы не опубликовали минимальный тестовый пример даже для самых простых тестов.   -  person IRTFM    schedule 08.02.2015
comment
Мне было непонятно... не будучи пользователем ff.... можно или нельзя использовать обычные функции с ff-векторами. Поэтому я предлагаю вам опубликовать воспроизводимый пример. Вы разместили пример data.table, ... теперь опубликуйте пример ff. Ваш irisdf НЕ является объектом ffdf, когда этот код запускается на моей машине.   -  person IRTFM    schedule 08.02.2015
comment
@BondedDust, ты прав насчет ave   -  person Qbik    schedule 08.02.2015
comment
@Qbik Может быть, вы могли бы проверить ffdfdply от library(ffbase)   -  person akrun    schedule 08.02.2015
comment
@akrun не могли бы вы дать ответ с помощью ffdfdply? ave кажется, ломается на больших наборах данных (>40 м наблюдений), я только что проверил это.   -  person Qbik    schedule 08.02.2015
comment
@Qbik Я опубликовал решение. Пожалуйста, проверьте, работает ли это   -  person akrun    schedule 08.02.2015
comment
@BondedDust имеет такой же вывод, как ave, но принимает factor в качестве группирующей переменной?   -  person Qbik    schedule 09.02.2015
comment
ave должен принимать факторный индекс/вектор группировки.   -  person IRTFM    schedule 09.02.2015
comment
@BondedDust кажется, что у меня слишком большое количество уровней (без сообщения об ошибке) или, возможно, есть проблема при работе с большими объектами ffdf и   -  person Qbik    schedule 09.02.2015


Ответы (1)


Возможно это поможет

library(data.table)
library(ffbase)
x1 <- as.ffdf(iris)
fd1 <- ffdfdply(x1, split=as.character(x1$Species), FUN=function(x) {
 x2 <- as.data.table(x)
 res <- x2[, NewMean:= mean(Sepal.Length), Species]
 as.data.frame(res)
}, trace=T)
person akrun    schedule 08.02.2015