2017-07-09 1 views
4

Ich habe einen Datenrahmen, die ich Gruppierung bin die group_by-Funktion und einer Zusammenfassung es mit der Verwendung der summarise Funktion in R.Gruppierung und Zusammenfassung von anderen Spalten in R zu halten

MM_group<-group_by(SYC,Method,Maturity) 

Mein-Datensatz sieht wie folgt aus,

Year   Group County Seed.Brand Seed.Variety Seed.Maturity 
1 2014 Group 0 No-till Yankton  Asgrow  AG0832   0.8 
2 2014 Group 0 No-till Brown  Asgrow  AG0934   0.9 
3 2014 Group 0 No-till Brown  Asgrow  AG0934   0.9 
4 2014 Group 0 No-till Brown  Asgrow  AG0934   0.9 
5 2014 Group 0 No-till Brown Pioneer  90Y90   0.9 
6 2014 Group 0 No-till Brown  Asgrow  AG0934   0.9 

Yield Method Maturity digits 
1 73.23 No-till  0  0 
2 65.14 No-till  0  0 
3 63.63 No-till  0  0 
4 61.57 No-till  0  0 
5 60.20 No-till  0  0 

Ich bin nach Methode gruppiert & Maturity. Ich versuche County und Jahr für maximale Ausbeute für die Methode & Fälligkeit Kombination zu erhalten.

Ich habe folgendes getan:

summarize(MM_group,Max_Yield=max(Yield)) 

     Method Maturity Max_Yield 
      <chr> <chr>  <dbl> 
1  Irrigated  0 69.600 
2  Irrigated  1 86.013 
3  Irrigated  2 88.750 
4  Irrigated  3 79.650 
5  No-till  0 79.470 
6  No-till  1 79.856 
7  No-till  2 85.860 
8  No-till  3 68.530 
9 Non-irrigated  0 83.210 
10 Non-irrigated  1 81.916 
11 Non-irrigated  2 103.740 
12 Non-irrigated  3 94.410 

Aber das gibt mir nicht die Kreisnamen und Jahr. Ich weiß, dass ich cbind oder Joins verwenden kann, um diese Daten zu bekommen, aber ich frage mich, ob es noch einen einfacheren Weg gibt, dies zu tun.

Erwarteter Ausgang:

  Method Maturity Max_Yield Year     Group 
      <chr> <chr>  <dbl> <int>     <fctr> 
1  Irrigated  0 69.600 2012 Group 0 or 1 Irrigated 
2  Irrigated  1 86.013 2012 Group 0 or 1 Irrigated 
3  Irrigated  2 88.750 2013 Group 2 or 3 Irrigated 
4  Irrigated  3 79.650 2013 Group 2 or 3 Irrigated 
5  No-till  0 79.470 2013  Group 0 No-till 
6  No-till  1 79.856 2012  Group 1 No-till 
7  No-till  2 85.860 2013  Group 2 No-till 
8  No-till  3 68.530 2014  Group 3 No-till 
9 Non-irrigated  0 83.210 2013 Group 0 Non-irrigated 
10 Non-irrigated  1 81.916 2012 Group 1 Non-irrigated 
11 Non-irrigated  2 103.740 2014 Group 2 Non-irrigated 
12 Non-irrigated  3 94.410 2014 Group 3 Non-irrigated 
+0

http://www.sdsoybean.org/programs-events/yield-contest/ Sie sollten den gesamten Datensatz hier finden können – Kasi

+0

Woher stammen die Daten? Sind es die agronomischen Daten? – akrun

+0

Ja, das stimmt. Aber meine Daten sind eine Zusammenstellung aller Jahre. – Kasi

Antwort

5

Versuchen kann
summarize(MM_group, 
      rank = which.max(Yield), 
      Year_rank = Year[rank], 
      County_rank = County[rank]) 
+0

Das funktioniert wie ein Zauber! Das ist, was ich gesucht habe. Gute Möglichkeit, die Rangfunktion wie einen Index zu verwenden. – Kasi

+0

@Kasi Ich benutze nicht die Funktion * rank *, es ist nur der Name einer neuen Spalte, Sie könnten stattdessen * foo * verwenden, es würde immer noch funktionieren. Und ich denke, der Name * rank * ist eine schlechte Namenswahl, mein Fehler. –

3

Wir

SYC %>% 
    group_by(Method, Maturity) %>% 
    slice(which.max(Yield)) %>% 
    rename(Max_Yield = Yield) %>% 
    select(Method, Maturity, Max_Yield, Year, Group) 
+0

Das wird nicht funktionieren, weil ich maximale Ausbeute nach Methode und Laufzeit Spalte brauche. Ihre Methode besteht im Wesentlichen darin, die vier Attribute zu gruppieren und das Maximum zu finden. Ich versuche nur die Spalten für den Kreis und das Jahr hinzuzufügen. Etwas wie das: 'test <-left_join (MM_max, Daten, durch = c ('Methode' = 'Methode', 'Reife' = 'Reife', 'Max_Yield' = 'Ertrag')). – Kasi

+0

@Kasi Ich hatte auch eine andere Methode. Anhand Ihres kleinen Beispiels ist nicht klar, was die erwartete Ausgabe sein soll. Angenommen, Sie haben die gleiche 'Methode' für jede 'Grafschaft', 'Jahr', dann 'left_join' würde nicht funktionieren – akrun

+0

@Kasi Bitte zeigen Sie ein kleines reproduzierbares Beispiel und erwartete Ausgabe statt nur 4 Zeilen – akrun

3

Sie die arrange und slice Methode verwenden, können Sie wie folgt vor:

library(dplyr) 
df %>% 
    arrange(Method, Maturity, desc(Yield)) %>% 
    group_by(Method, Maturity) %>% 
    slice(1) %>% 
    ungroup %>% 
    select(Method, Maturity, Yield, Year, Group) %>% 
    rename(Max_Yield = Yield) 
Verwandte Themen