2013-07-22 3 views
2

У меня есть проблема с R, ffdfdply функциюR ffdfdply раскол вопрос

a=as.ffdf(data.frame(b=11:20,c=c(4,4,4,4,4,5,5,5,5,5), d=c(1,1,1,0,0,0,1,0,1,1))) 

ffdfdply(a, split=a$c, FUN= function(x) {data.frame(cumsum(x$d))}, trace=T) 

Выход его генерации является просто накопленная сумма без учета критериев разделения.

мне нужен выход, как этот

c cumsum 
4 1 
4 2 
4 3 
4 4 
4 4 
5 0 
5 1 
5 1 
5 2 
5 3 

Можем ли мы включить несколько столбцов под «раскол»? Было бы здорово, если бы кто-нибудь предоставил пример.

Спасибо.


@jwijffels, я проверить свое решение на другом наборе данных

i=as.ffdf(data.frame(a=c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2), b=c(1,4,6,2,5,3,1,4,3,2,8,7,1,3,5,4,2,6,3,1,2), c=c(1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2), d=c(1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,0,1,1,1,1,0))) 

Выход я получил неправильно. Мне нужна кумулятивная сумма столбца d на основе столбцов a и c.

ниже шаг является правильным и дал правильный результат

idx <- ffdforder(i[c("a","c","b")]) 
ordered_i <- i[idx, ] 
ordered_i$key_a_c <- ikey(ordered_i[c("a", "c")]) 

, но когда я пытаюсь кумулятивную сумму, получили неправильный результат.

cumsum_i <- ffdfdply(ordered_i, split=as.character(ordered_i$key_a_c), FUN= function(x) { 
    ## Data in RAM, on which you can use data.table 
    x <- as.data.table(x) 
    result <- x[, cumsum_a_c := cumsum(x$d), by = list(key_a_c)] 
    as.data.frame(result) 
}, trace=T) 

Просьба помочь. Мне нужно запустить этот набор команд для больших данных.

+0

Возможный дубликат [с использованием ffdfdply для разделения данных и получения характеристик каждого идентификатора в расколе] (http://stackoverflow.com/questions/10981384/using-ffdfdply-to-split-data -and-get-characteristics-of-each-id-in-the-split) – thelatemail

+0

Используйте cumsum_a_c: = cumsum (d) вместо cumsum_a_c: = cumsum (x $ d). Это правильный синтаксис data.table внутри FUN. – jwijffels

ответ

4

Правильное использование будет этот

require(ffbase) 
require(data.table) 
a=as.ffdf(data.frame(b=11:20,c=c(4,4,4,4,4,5,5,5,5,5), d=c(1,1,1,0,0,0,1,0,1,1))) 
ffdfdply(a, split=as.character(a$c), FUN= function(x) { 
    ## Data in RAM, on which you can use data.table 
    x <- as.data.table(x) 
    result <- x[, cumsum := cumsum(d), by = list(c)] 
    as.data.frame(result) 
    }, trace=T) 

Если вы хотите разделить на 2 колонки, просто сделать новый столбец объединения и столбцы и использовать это как split.См. ?ikey для создания этой колонки

+0

Если у нас есть большие данные, я полагаю, что x <- as.data.table (x) создает проблему с памятью. – Ajay

+0

Нет, у вас не будет проблем с памятью. То, что вы получаете в «x», является подмножеством вашего «a» ffdf, где группы данных одного или нескольких разделенных элементов помещаются в ОЗУ. Размер этого подмножества, который вы помещаете в ОЗУ и на котором вы будете применять FUN, контролируется BATCHBYTES. – jwijffels

+0

Спасибо ... Thats great – Ajay

1

Чтение помощь несколько полезно здесь, от ?ffdfdply

эта функция не расщепляется данные. Чтобы уменьшить число , данные помещаются в ОЗУ для ситуаций с множеством уровней разделения , функция извлекает группы разделенных элементов, которые могут быть отправлены в ОЗУ в соответствии с BATCHBYTES.

И ....

Пожалуйста, убедитесь, что ваш FUN охватывает тот факт, что несколько расщепленных элементов могут быть в одном куске данных, на которых применяются FUN.

Таким образом, по моему чтению вам нужно иметь функцию split-comb-style, которая работает с группами в рамках функции, которую вы вызываете на ffdfdply. Как и с помощью ave:

a$c <- with(a, as.integer(c)) 
ffdfdply(
    a, 
    split=a$c, 
    function(x) data.frame(c=x$c,cumsum=ave(x$d,x$c,FUN=cumsum)), 
    trace=T 
) 

Результат:

c cumsum 
1 4  1 
2 4  2 
3 4  3 
4 4  3 
5 4  3 
6 5  0 
7 5  1 
8 5  1 
9 5  2 
10 5  3 
+0

Спасибо .. Пожалуйста, поправьте меня, если я ошибаюсь. BATCHBYTES играют важную роль в ffdfdply. Если мы не уверены в данных, и фиксированные BATCHBYTES приведут к непоследовательному результату. Не могли бы вы привести пример, чтобы включить несколько столбцов под разделом. – Ajay

+0

@Ajay - Я не очень хорошо разбираюсь в 'ff', но это звучит так, как будто' ffdfdply' может занять несколько разделенных групп в одну 'BATCHBYTE' в зависимости от размера каждой группы и размера' BATCHBYTE'. Поэтому у вас должна быть ** другая функция группировки только в том случае, если в партии есть> 1 группа. – thelatemail

+0

Да, поэтому в документе говорится: «Пожалуйста, убедитесь, что ваш FUN покрывает тот факт, что несколько разделенных элементов могут быть в одном фрагменте данных, на которые применяется FUN». – jwijffels

Смежные вопросы