2016-05-27 16 views
1

Ich habe diese data.frame:dplyr: Rohre im Inneren zusammenfassen der nach group_by

df_test = structure(list(`MAE %` = c(-0.0647202646339709, -0.126867775585001, 
-1.81159420289855, -1.03092783505155, -2.0375491194877, -0.160783192796913, 
-0.585827216261999, -0.052988554472234, -0.703351261894911, -0.902996305924203, 
-0.767676767676768, -0.0101091791346543, -0.0134480903711673, 
-0.229357798165138, -0.176407935028625, -0.627062706270627, -1.75706139769261, 
-1.23024009524439, -0.257391763463569, -0.878347259688137, -0.123613523987705, 
-1.65711947626841, -2.11718534838887, -0.256285931980328, -1.87152777777778, 
-0.0552333609500138, -0.943983402489627, -0.541095890410959, 
-0.118607409474639, -0.840453845076341), Profit = c(7260, 2160, 
-7080, 3600, -8700, 6300, -540, 10680, -1880, -3560, -720, 5400, 
5280, 1800, 11040, -240, -2320, 2520, 10300, -2520, 8400, -9240, 
-5190, 7350, -6790, 3600, -3240, 8640, 7150, -2400)), .Names = c("MAE %", 
"Profit"), row.names = c(NA, 30L), class = "data.frame") 

Jetzt möchte ich einige zusammenfassende Statistiken wie:

df_test %>% 
    group_by(win.g = Profit > 0) %>% 
    summarise(GroupCnt = n(), 
       TopMAE = filter(`MAE %` > -1) %>% sum(Profit), 
       BottomMAE = filter(`MAE %` <= -1) %>% sum(Profit)) 

So wir Gruppendaten, wenn Profit> 0 oder < = 0. Dann möchte ich sum() von Profit für Zeilen mit MAE% < = -1 und für MAE%> -1. Gruppierung muss für TopMAE, BottomMAE Berechnung verwendet werden.

Erwartetes Ergebnis ist wie:

# win.g CroupCnt TopMAE BottomMAE 
#1 FALSE  14 -15100 -39320 
#2 TRUE  16 95360  6120 

Aber mein R-Code arbeitet nicht. Ich habe einen Fehler:

Error: no applicable method for 'filter_' applied to an object of class "logical"

ich meinen Code geändert haben nach Fehler:

df_test %>% 
    group_by(win.g = Profit > 0) %>% 
    summarise(UnderStop = n(), 
       TopMAE = filter(., `MAE %` > -1) %>% sum(Profit), 
       BottomMAE = filter(., `MAE %` <= -1) %>% sum(Profit)) 

Aber das Ergebnis ist keine. Ich habe einen Fehler wieder:

Error: incorrect length (14), expecting: 16

Ich versuchte Gruppierung Verhalten zu verstehen und wie Rohrleitungen verwenden innen zusammenfassen nach dem Gruppieren, aber ich habe nicht den Erfolg. Verbringe den ganzen Tag damit.

WIE kann ich meine erwartete Ergebnistabelle erhalten? Bitte helfen Sie mir zu verstehen, dplyr Logik beim Gruppieren und Berechnen einiger Funktionen in diesen Gruppen.

Antwort

3

Ist das wonach Sie suchen? (Fragen nur, weil ich unterschiedliche Ergebnisse thatn Ihre Ausgabe zu erhalten),

df_test %>% 
     group_by(win.g = Profit > 0) %>% 
     summarise(CroupCnt = n(), TopMAE = sum(Profit[`MAE %` > -1]), 
           BottomMAE = sum(Profit[`MAE %` <= -1])) 

#Source: local data frame [2 x 4] 

# win.g CroupCnt TopMAE BottomMAE 
# (lgl) (int) (dbl)  (dbl) 
#1 FALSE  14 -15100 -39320 
#2 TRUE  16 95360  6120 
+0

Vielen Dank für Ihre Lösung. Es ist wirklich lesbar und schnell. Meine erwarteten Zahlen waren falsch, wie ich jetzt sehe. Habe das in meinem Post korrigiert. @ Benjamin gibt uns auch eine sehr gute Lösung und mehr dplyr gestylt. Ich habe für deine gewählt, weil du die erste warst. Aber was ist mit Rohrleitungen innen zusammenfassen und mutieren und so weiter? Ist es möglich oder nicht? – ra81

2

Persönlich bevorzuge ich ein Problem wie dieses mit der Anerkennung arbeiten, die Sie gruppiert Operationen auf zwei Dimensionen durchführen, aber Ihr Code verwendet man nur Abmessungen. Hier ist ein Beispiel, das dieselbe Arbeit über zwei Dimensionen ausführt. Es ist ein bisschen mehr Code als @Sotos zur Verfügung gestellt, aber bietet das gleiche Ergebnis, das er bekam.

library(dplyr) 
library(tidyr) 

df_test %>% 
    #* Group on two dimensions 
    group_by(win.g = Profit > 0, 
      top = ifelse(`MAE %` > -1, "TopMAE", "BottomMAE")) %>% 
    summarise(GroupCnt = n(), 
      SumProfit = sum(Profit)) %>% 
    ungroup() %>% 

    #* Collapse the GroupCnt 
    group_by(win.g) %>% 
    mutate(GroupCnt = sum(GroupCnt)) %>% 
    ungroup() %>% 

    #* From long to wide 
    spread(top, SumProfit) 
+0

War nicht sicher über die Ergebnisse, da sie anders sind als OPs erwartete Ergebnisse, aber wenn Sie die gleichen bekommen, dann denke ich, es ist wahr – Sotos

+1

Ich war ein wenig besorgt, bis ich Ihre Antwort sah. Und für das, was es wert ist, habe ich festgestellt, dass Ihre Antwort in diesem Beispiel ungefähr doppelt so schnell ist wie meine. Als ich es auf 1000 Zeilen erweiterte, war es viermal schneller. (2 vs 4 Millisekunden). Wenn ich wirklich große Datenmengen verwenden würde, würde ich wahrscheinlich zu Ihrer Antwort übergehen. – Benjamin

+0

Gut zu wissen. :) – Sotos

Verwandte Themen