Выполнение расчетов на фрейме данных из объекта ffdf
Я работаю с большим набором данных (3,5 млн строк и 40 столбцов), и мне нужно очистить некоторые значения, чтобы иметь возможность рассчитать другие параметры, которые мне необходимы, когда я начну формулировать модель вокруг данных.
Проблема в том, что применение циклов for, которые я использую, требует вечности, поэтому я хотел попробовать использовать пакет ff. Фрейм данных называется data и состоит из набора данных о клиентах для банка. Он был импортирован как файл.csv. Что мне нужно сделать, это удалить всех клиентов (помеченных как Serial), если их переменная AverageStanding когда-либо будет отрицательной
> ffd<-as.ffdf(data)
> lastserial = tail(ffd$Serial,1)
> for(k in 1:lastserial){
+ tempvecWith <- vector()
+ tempvecWith <- ffd[ffd$Serial==k, ]$AverageStanding
+ if(any(tempvecWith < 0)){
+ ffd_clean<- ffd[!ffd$Serial ==k, ]
+ }
+ }
Это ошибка, которую я получаю:
Error in as.hi.integer(x, maxindex = maxindex, dim = dim, vw = vw, pack = pack) :
NAs in as.hi.integer
Любые идеи о том, как я могу избежать этих ошибок?
1 ответ
Ошибка происходит из этой части вашего кода ffd[ffd$Serial==k, ]
, а именно ffd$Serial==k
возвращает логический вектор ff. Но если вы хотите проиндексировать или задать подмножество вектора ff или ffdf, вам нужно указать номера индекса, а не вектор логики. Вы можете превратить ваш вектор ff логики в вектор ff индексных чисел, используя ffwhich из пакета ffbase.
Так что по вашим вопросам, я полагаю, вы ищете такой код (не проверенный, поскольку вы не предоставили никаких данных).
require(ffbase)
idx <- ffd$AverageStanding < 0
idx <- ffwhich(idx, idx==TRUE)
open(ffd)
serials.with.negative <- ffd$Serial[idx]
serials.with.negative <- unique(serials.with.negative)
ffd$is.customer.with.negative.avgstanding <- ffd$Serial %in% serials.with.negative
idx <- ffd$is.customer.with.negative.avgstanding == FALSE
idx <- ffwhich(idx, idx==TRUE)
open(ffd)
ffd_clean <- ffd[idx, ]