2016-03-24 12 views
-3

Ich habe einen data.table wie dieseberechnen Mittelwert akkumulierte mit Bedingung

a <- data.table(
    A = c(1:6), 
    B = c(1,2,2,3,4,2), 
    C = c("t","t","f","t","f","t") 
) 
    A B C 
1: 1 1 t 
2: 2 2 t 
3: 3 2 f 
4: 4 3 t 
5: 5 4 f 
6: 6 2 t 

In jeder Reihe, ich möchte den Mittelwert aller vorherigen Zeilen berechnen, aber mit der Bedingung, dass sie die Zeile mit C == f ausschließen . Das Ergebnis sollte

A B C D E 
1: 1 1 t NA NA 
2: 2 2 t 1 1 
3: 3 2 f 1.5 1.5 
4: 4 3 t 1.5 1.5 
5: 5 4 f 3.5 3 
6: 6 2 t 3.5 3 

sein Wie kann ich das tun?

+5

Also was ist dein erwartetes Ergebnis? – Sotos

+0

@Jimbou es ist eine data.table –

+0

Ihre erwartete Ausgabe macht keinen Sinn. Bitte fügen Sie die Formeln hinzu, die Sie verwendet haben. Warum für Zeilen 5: 6 sind die Werte 3,5 und 3? Es sollte 2.333 und 2 nach Ihrer Beschreibung –

Antwort

1

Meinst du den kumulativen Mittelwert? Dann sollte dies tun, was Sie verlangen:

a[C != "f", lapply(.SD, FUN = function(x) {cumsum(x)/seq_along(x)}), 
    .SDcols = c("A", "B")] 

      A B 
1: 1.000000 1.0 
2: 1.500000 1.5 
3: 2.333333 2.0 
4: 3.250000 2.0 
+3

Was ist der Sinn des Down-Vote, wenn Sie nicht einmal zu Ihrem Problem mit dieser Antwort kommentieren? Auf der Grundlage der vom OP gemachten Angaben verlangte er dies. – matthias

+0

Das Problem mit dem Kommentieren und Downvoting ist die Möglichkeit der Rache-Downvotes. Ich bin jedoch nicht der Downvoter. – akrun

+2

Für mich wäre es besser gewesen, wenn das OP die erwartete Ausgabe gepostet hätte. BTW, da ist 'cummean' von' dplyr' – akrun

Verwandte Themen