Tôi đang cố gắng tạo cột trong một khung dữ liệu rất lớn (~ 2,2 triệu hàng) để tính tổng tích luỹ của 1 cho mỗi cấp độ nhân tố và đặt lại khi đạt đến mức hệ số mới. Dưới đây là một số dữ liệu cơ bản giống với dữ liệu của riêng tôi.vectorize cumsum theo hệ số 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)
Tôi muốn biến đầu ra, cum.goodp, trông như thế này:
cum.goodp <- c(0, 1, 2, 0, 1, 1, 2, 0, 0, 1, 1, 1, 2, 0, 1)
Tôi nhận được rằng có rất nhiều trên mạng bằng cách sử dụng split-áp-kết hợp phương pháp kinh điển, mà , khái niệm là trực quan, nhưng tôi đã thử sử dụng các mục sau:
k <- transform(df, cum.goodp = goodp*ave(goodp, c(0L, cumsum(diff(goodp != 0)), FUN = seq_along, by = itemcode)))
Khi tôi cố gắng chạy mã này, nó rất chậm. Tôi nhận được sự biến đổi đó là một phần của lý do tại sao ('by' cũng không giúp được gì). Có hơn 70K giá trị khác nhau cho biến itemcode, vì vậy nó có thể được vectorized. Có cách nào để vectorize này, bằng cách sử dụng cumsum? Nếu không, bất kỳ sự giúp đỡ nào cũng sẽ được đánh giá cao. Cám ơn rất nhiều.
Bạn có thể hiển thị kết quả mong muốn không? –
@akrun nó là một câu hỏi r – jvalenti
Có lẽ bạn đang tìm kiếm 'chuyển đổi (df, cum.goodp = ave (goodp, itemcode, FUN = cumsum))' nhưng nó thực sự không rõ ràng với tôi .. –