Я пытаюсь создать столбец в очень большом кадре данных (~ 2,2 миллиона строк), который вычисляет суммарную сумму 1 для каждого уровня фактора и сбрасывается при достижении нового уровня фактора. Ниже приведены некоторые основные данные, которые напоминают мои собственные.векторизовать cumsum в R
itemcode <- c('a1', 'a1', 'a1', 'a1', 'a1', 'a2', 'a2', 'a3', 'a4', 'a4', 'a5', 'a6', 'a6', 'a6', 'a6')
goodp <- c(0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1)
df <- data.frame(itemcode, goodp)
Я хотел бы выходной переменный, cum.goodp, чтобы выглядеть следующим образом:
cum.goodp <- c(0, 1, 2, 0, 1, 1, 2, 0, 0, 1, 1, 1, 2, 0, 1)
Я понимаю, что есть много там с помощью канонического разделенным применить-Combine подход, который концептуально интуитивно, но я попытался использовать следующее:
k <- transform(df, cum.goodp = goodp*ave(goodp, c(0L, cumsum(diff(goodp != 0)), FUN = seq_along, by = itemcode)))
Когда я пытаюсь запустить этот код, это очень и очень медленно. Я получаю, что преобразование является частью причины, почему («by» не помогает). Для переменной itemcode существует более 70K различных значений, поэтому, вероятно, она должна быть векторизованной. Есть ли способ векторизовать это, используя cumsum? Если нет, любая помощь будет по-настоящему оценена. Спасибо.
Можете ли вы показать ожидаемый результат, пожалуйста? –
@akrun это вопрос r – jvalenti
Возможно, вы ищете 'transform (df, cum.goodp = ave (goodp, itemcode, FUN = cumsum))', но мне это действительно непонятно .. –