Tôi có một khung dữ liệu, khung dữ liệu đã được sắp xếp khi cần thiết, nhưng bây giờ tôi sẽ muốn "cắt nó" theo nhóm.Có điều kiện cumsum với thiết lập lại
nhóm này nên có một giá trị tích lũy tối đa của 10. Khi giá trị tích lũy là> 10, cần thiết lập lại số tiền tích lũy và bắt đầu lại một lần nữa
library(dplyr)
id <- sample(1:15)
order <- 1:15
value <- c(4, 5, 7, 3, 8, 1, 2, 5, 3, 6, 2, 6, 3, 1, 4)
df <- data.frame(id, order, value)
df
Đây là sản phẩm tôi đang tìm kiếm (tôi đã làm nó "bằng tay")
cumsum_10 <- c(4, 9, 7, 10, 8, 9, 2, 7, 10, 6, 8, 6, 9, 10, 4)
group_10 <- c(1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7)
df1 <- data.frame(df, cumsum_10, group_10)
df1
Vì vậy, tôi đang gặp 2 vấn đề
- Làm thế nào để tạo một biến tích lũy mà reset mọi lúc nó đi một giới hạn trên (10 trong trường hợp này)
- Làm thế nào để đếm/nhóm mỗi nhóm
Đối với phần đầu tiên tôi đã cố gắng một số kết hợp của group_by và cumsum không có may mắn
df1 <- df %>% group_by(cumsum(c(False, value < 10)))
tôi muốn một ống (%>%) giải pháp thay vì một vòng lặp for
Cảm ơn
Phần thứ hai sẽ là tầm thường ('group_by') nếu bạn có thể tìm ra điểm đầu tiên. Tôi nghĩ sẽ rất khó để làm việc đầu tiên mà không có vòng lặp 'for', trừ khi ai đó cực kỳ thông minh. Bạn có muốn ống cho hiệu quả, sang trọng, ...? Nếu có một vòng lặp for ẩn trong một hàm trợ giúp thì có được không? –
kiểm tra xem http://stackoverflow.com/questions/29054459/how-to-speed-up-or-vectorize-a-for-loop/29055443#29055443 – Khashaa
'group_by (bin (giá trị, 10))%>% mutate (cumsum (value)) 'sử dụng hàm' bin' trong liên kết – Khashaa