2016-07-30 11 views
1

Für jedes Jahr gibt es zwei Gruppen, wobei die erste Gruppe über der zweiten Gruppe liegt. Ich möchte eine Spalte hinzufügen, die angibt, in welcher Gruppe sich eine Zeile befindet: die erste oder die zweite. Ich habe Gruppen für dieses Beispiel markiert, aber das Feld erscheint nicht im realen Dataset.Etikettieren eines gestapelten Datensatzes

year measure data ... 
1991  1 ... [group 1] 
1991  2  [group 1] 
1991  3  [group 1] 
1991  1  [group 2] 
1991  2  [group 2] 
1991  3  [group 2] 
1991  4  [group 2] 
1992  1  [group 1] 
1992  2  [group 1] 
1992  3  [group 1] 
1992  1  [group 2] 
1992  2  [group 2] 
1992  3  [group 2] 
1992  4  [group 2] 

Antwort

1

Wir können mit versuchen entweder data.table, dplyr oder base R Methoden. Unter Verwendung von data.table konvertieren wir den 'data.frame' in 'data.table' (setDT(df1)), gruppiert nach 'Jahr', überprüfen wir die Differenz der angrenzenden Elemente von 'messen' ist kleiner als 0, erhalten die kumulative Summe und paste mit 'group' um die 'grp' Spalte zu erstellen.

library(data.table) 
setDT(df1)[, grp := paste("group", cumsum(c(TRUE, diff(measure) < 0))), year] 
df1 
# year measure  grp 
#1: 1991  1 group 1 
#2: 1991  2 group 1 
#3: 1991  3 group 1 
#4: 1991  1 group 2 
#5: 1991  2 group 2 
#6: 1991  3 group 2 
#7: 1991  4 group 2 
#8: 1992  1 group 1 
#9: 1992  2 group 1 
#10:1992  3 group 1 
#11:1992  1 group 2 
#12:1992  2 group 2 
#13:1992  3 group 2 
#14:1992  4 group 2 

Die gleiche Methodik kann in dplyr

library(dplyr) 
df1 %>% 
    group_by(year) %>% 
    mutate(grp = paste("group", cumsum(c(TRUE, diff(measure) < 0)))) 
+0

Was Mechaniker tut verwendet werden? 'cumsum (c (TRUE,' – Hatshepsut

+1

@Hatshepsut das 'diff 'gibt eine Länge von eins weniger als die ursprüngliche Länge zurück, also verketten wir mit' TRUE' nach dem Konvertieren der Diff-Ausgabe zu logisch und wenn wir Cumsum machen, das TRUE/FALSE erzwingt auf Binär und für jeden WAHR-Wert wird einer hinzugefügt. – akrun

Verwandte Themen