2016-07-21 2 views
2

ich folgende Datenrahmen erhalten haben:Gruppe Zeilen in einem Datenrahmen, nehmen Sie die Maximalwerte und berechnen die Gruppen bedeuten

df <- read.table(text = " 
    Station Area Day  Flow 
1  21009 4390.00 1913 725.661 
2  24005 178.50 1913 25.540 
3  25009 1264.00 1913 318.481 
4  27002 758.90 1913 230.556 
5  38003 133.90 1913  2.823 
70 37006 228.40 9526 68.140 
71 37008 190.30 9526 38.175 
72 37009 60.70 9526 12.200 
73 37018 47.90 9526 19.209 
156 38021 42.20 12551 15.330 
157 39093 117.60 12551 33.090 
158 40004 206.00 12551 49.019 
159 41005 180.90 12551 63.574 
188 41006 87.80 14329 67.130 
189 41011 154.00 14329 125.000 
190 41012 93.30 14329 43.640 
191 41014 379.00 14329 218.000 
192 41015 58.30 14329  5.080", header = TRUE) 

Ich mag würde die dplyr Paket anwenden, um (sollte der schnellste Weg sein) zu gruppieren Sie die Zeilen nach der Spalte Day, dann nehmen Sie den max und den Mittelwert von Area, während Sie die entsprechenden Beobachtungen in den anderen 2 Spalten behalten.

sollte Mein ausgegeben:

Station Area Day  Flow Group_mean 
1  21009 4390.00 1913 725.661 1345.06 
70 37006 228.40 9526  68.140  131.83 
158 40004 206.00 12551 49.019  136.68 
191 41014 379.00 14329 218.000  154.48 
+0

Was die Logik ist die 'Station' in dem erwarteten Ausgang – akrun

+0

hallo @akrun für immer und danke. Es gibt keine Logik für die Stationen, da sie automatisch mit der maximalen Fläche für jede Gruppe ausgewählt werden. –

+0

Ich habe gerade festgestellt, dass Sie eine von Ihnen gepostete Frage gelöscht haben. Ich verbringe etwas Zeit, um es zu beantworten ... – akrun

Antwort

4

Wir dplyr verwenden können. Nach der Gruppierung nach "Tag", wir summarise die Daten durch die first Wert von 'Area', Wert von 'Station', wo der 'Flow' ist maximal, erhalten die max 'Flow' und auch die mean von 'Area'.

library(dplyr) 
df %>% 
    group_by(Day) %>% 
    summarise(Area1 = max(Area), 
      Station = Station[which.max(Flow)], 
      Flow = max(Flow), 
      Group_mean = mean(Area)) %>% 
      rename(Area = Area1) 
#  Day Area Station Flow Group_mean 
# <int> <dbl> <int> <dbl>  <dbl> 
#1 1913 4390.0 21009 725.661 1345.060 
#2 9526 228.4 37006 68.140 131.825 
#3 12551 206.0 41005 63.574 136.675 
#4 14329 379.0 41014 218.000 154.480 

EDIT: Basierend auf @agenis und @Sotos kommentiert

+0

Ich denke, du musst zuerst den Mittelwert berechnen und dann den Maximalwert nehmen (sonst macht es keinen Sinn, den Mittelwert zu nehmen), aber ja, OP muss besser klären – Sotos

+1

@Sotos Danke für den Hinweis, ich habe vergessen, dass ich mich geändert habe Die Variable. – akrun

+0

Bitte vergessen Sie über die Flow-Spalte, ich bin nur interessiert, die maximale Fläche und Fläche bedeuten für jede Gruppe von Zeilen, nach Tag gruppiert. –

3

Sie sqldf verwenden könnte durch

library(sqldf) 
sqldf("select Station, max(Area), Day, Flow, sum(Area)/count(*) as mean from df group by Day") 
Verwandte Themen