Ich möchte einen Vektor basierend auf der Summe der Elemente gruppieren, die kleiner oder gleich n
sind. Nehmen wir die folgende,Gruppenvektor auf bedingter Summe
set.seed(1)
x <- sample(10, 20, replace = TRUE)
#[1] 3 4 6 10 3 9 10 7 7 1 3 2 7 4 8 5 8 10 4 8
#Where,
n = 15
Die erwartete Ausgabe Gruppenwerte sein würde, während ihre Summe < ist = 15, dh
y <- c(1, 1, 1, 2, 2, 3, 4, 5 ,5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10)
Wie Sie die Summe sehen kann, ist nie größer als 15 ist,
sapply(split(x, y), sum)
# 1 2 3 4 5 6 7 8 9 10
#13 13 9 10 15 12 12 13 14 8
HINWEIS: Ich werde dies auf riesigen Datensätzen (in der Regel> 150 - 200 GB) laufen, so dass Effizienz ein Muss ist.
Eine Methode, die ich versuchte, und in der Nähe kommt, aber nicht ist,
as.integer(cut(cumsum(x), breaks = seq(0, max(cumsum(x)) + 15, 15)))
#[1] 1 1 1 2 2 3 3 4 4 4 5 5 5 6 6 6 7 8 8 8
Haben Sie [hier] (https://stackoverflow.com/questions/34531568/conditional-cumsum-with-reset) und die Rcpp-Implementierung [hier] (https://stackoverflow.com/questions/29054459/How-to-Geschwindigkeit-Up-oder-Vectorize-a-for-Schleife/29055443 # 29055443) – akrun
@akrun Danke für die Links. Ich werde sie so schnell wie möglich lesen – Sotos
Ja, es ist ein Duplikat, @akrun Sie hatten hier eine Lösung, die auch verallgemeinert werden könnte: https://stackoverflow.com/questions/44512075/resetting-cumsum-if-value-goes-to- Negativ-in-r –