Выполнение расчетов на фрейме данных из объекта 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, ]
Другие вопросы по тегам