Выполнение расчетов по кадру данных из объекта ffdf

Я работаю с большим набором данных (3,5 млн строк и 40 столбцов), и мне нужно очистить некоторые значения, чтобы я мог рассчитать другие параметры, которые мне необходимы, когда я начну формулировать модель на основе данных.

Проблема в том, что применение циклов for, которые я использовал, занимает целую вечность, поэтому я хотел попробовать использовать пакет ff. Фрейм данных называется данными и состоит из набора информации о клиенте для банка. Он был импортирован как файл .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

Любые идеи о том, как я могу избежать этих ошибок?


r ff
person user1497079    schedule 21.08.2013    source источник


Ответы (1)


Ошибка исходит из этой части вашего кода ffd[ffd$Serial==k, ]. А именно ffd$Serial==k возвращает логический вектор ff. Но если вы хотите проиндексировать или подмножество вектора ff или ffdf, вам нужно предоставить номера индексов, а не вектор логики. Вы можете превратить свой ff-вектор логики в ff-вектор индексов, используя ffwhat из пакета 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, ]
person Community    schedule 23.08.2013