Ich bin neu in R und hier. Ich benutze diese Seite sehr oft, aber dieses Mal stecke ich in einem Problem, für das ich keine Lösung finden kann.Wie übersetzt man diese doppelte indizierte for-Schleife in eine effiziente?
Ich habe einen Datenrahmen wie folgt aus:
df <- data.frame(id = c("A","A","B","B","B","C","D","D","D","D"),
elapsed = c(10,15,5,7,20,4,3,4,15,16),
val = c(5,8,1,2,4,6,7,9,8,3),
acum = c(0,0,0,0,0,0,0,0,0,0))
Und ich brauche für jede Zeile zu akkumulieren, die Gesamt „val“ aus anderen Reihen mit der gleichen „id“ und ein „abgelaufen“ nicht mehr als 5 Einheiten weniger Strom (es wird in Sekunden gemessen).
Ie .: Ich wähle eine Zeile aus, sage ich, und registriere ihr "val" in acum [i]. Dann schaue ich zurück auf die vorherige Reihe, i-1. Ich überprüfe, dass es dieselbe ID hat wie i an, dass sein "verstrichen" nicht weniger als 5 der der Reihe i ist. Wenn es so ist, summiere ich seinen Wert mit dem acum [i]. Ich wiederhole den Schritt mit allen überlegenen Verzögerungen, und so weiter.
Um das zu tun, rief ich diese Schleife:
for (i in 2:nrow(df)) {
for(l in 0:nrow(df)) {
if(l<i) {
if (df[i,"id"]==df[i-l,"id"])
{if (df[i,"elapsed"]-df[i-l,"elapsed"]<=5)
{df$acum[i] <- df$acum[i]+df[i-l,"val"]}
}
}
}
}
# id elapsed val acum
# 1 A 10 5 0
# 2 A 15 8 13
# 3 B 5 1 1
# 4 B 7 2 3
# 5 B 20 4 4
# 6 C 4 6 6
# 7 D 3 7 7
# 8 D 4 9 16
# 9 D 15 8 8
# 10 D 16 3 11
Das Problem ist, dass, wenn die data.frame größer wird, die Schleife immer mehr Zeit damit verbringt, um diese Aufgabe zu tun (auch mehrere Stunden).
Ich surfte google und navigierte Stackoverflow ein jeder gibt den gleichen Rat: Verwenden Sie die Funktionen anwenden. Aber ich kann mir nicht vorstellen, wie es in diesem Fall geht. Vielleicht mapply, aber da ich neu darin bin bin ich mir nicht sicher wie.
Könnte mir jemand dabei helfen?
Vielen Dank im Voraus, Santiago.-
Mit 'dplyr', vielleicht 'df%>% group_by (id)%>% mutieren (acum = val + (Verzögerung (val, default = 0) * ifelse (Verzögerung (verstrichen, Standard = 0)> = (verstrichen - 5), 1, 0))) ' – alistaire
Fast! Das ist ein großartiger Ansatz. Aber hier würde es nur die erste Verzögerung berücksichtigen, und es kann Reihen in überlegenen Verzögerungen geben, die die Kriterien erfüllen, und das Feuer sollte summiert werden. – sfucci
@alistaire - bitte posten Sie Ihren Kommentar als eine realisierbare Antwort. – Parfait