2014-11-15 8 views
6

Ich habe einen Datenrahmen, der wie folgt aussieht:Gruppe durch und Umfang/normalisieren eine Spalte in r

Store Temperature Unemployment Sum_Sales 
1  1  42.31  8.106 1643691 
2  1  38.51  8.106 1641957 
3  1  39.93  8.106 1611968 
4  1  46.63  8.106 1409728 
5  1  46.50  8.106 1554807 
6  1  57.79  8.106 1439542 

Was ich nicht in R herausfinden kann, ist, wie Gruppe durch und anzuwenden. Daher möchte ich für jeden Speicher (gruppiert) zwei Spalten (sum_sales und temperature) normalisieren/skalieren.

Wunsch Ausgabe, die ich will, ist folgende:

Store Temperature Unemployment Sum_Sales 
1  1  1.000  8.106 1.00000 
2  1  0.000  8.106 0.94533 
3  1  0.374  8.106 0.00000 
4  2  0.012  8.106 0.00000 
5  2  0.000  8.106 1.00000 
6  2  1.000  8.106 0.20550 

Hier ist die Normierungsfunktion, die ich erstellt:

normalit<-function(m){ 
    (m - min(m))/(max(m)-min(m)) 
} 

ich das DPLY Paket bin mit und kann nicht scheinen zu Figur heraus, wie man nach Gruppen sortiert und diese Funktion auf eine Spalte anwendet. Ich habe so etwas versucht und bekomme einen Fehler:

df2 <- df %.% 
    group_by('Store') %.% 
    summarise(Temperature = normalit(Temperature), Sum_Sales = normalit(Sum_Sales))) 

Alle Vorschläge/Hilfe würde sehr geschätzt werden. Vielen Dank.

+0

Sie haben eine Spalte "Arbeitslosigkeit" in Ihrem Ergebnis. Ist das für jedes Geschäft gleich> – jlhoward

+0

ja .. Entschuldigung für die keine Angabe – itjcms18

Antwort

9

Das Problem ist, dass Sie das falsche dplyr Verb verwenden. Zusammenfassen erstellt ein Ergebnis pro Gruppe pro Variable. Was du willst, ist mutiert. Mutate ändert Variablen und gibt ein Ergebnis derselben Länge wie das Original zurück. Siehe http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html. Im Folgenden zwei Ansätze mit dplyr:

Hinweis: Die Store-Variable unterscheidet zwischen Ihren Daten und dem gewünschten Ergebnis. Ich nahm an, dass @jhoward die richtigen Daten bekommen hat.

+0

Ich erhalte eine Fehlermeldung "Funktion normalit konnte nicht gefunden werden". Gibt es ein Paket, das ich installieren muss? @Vincent –

+2

Siehe OP-Normalit-Funktion – Vincent

2

Hier ist eine data.table Lösung. Ich habe dein Beispiel ein wenig geändert, um zwei Arten von Geschäften zu haben.

df <- read.table(header=T,text="Store Temperature Unemployment Sum_Sales 
1  1  42.31  8.106 1643691 
2  1  38.51  8.106 1641957 
3  1  39.93  8.106 1611968 
4  2  46.63  8.106 1409728 
5  2  46.50  8.106 1554807 
6  2  57.79  8.106 1439542") 

library(data.table) 
DT <- as.data.table(df) 
DT[,list(Temperature=normalit(Temperature),Sum_Sales=normalit(Sum_Sales)), 
    by=list(Store,Unemployment)] 
# Store Unemployment Temperature Sum_Sales 
# 1:  1  8.106 1.00000000 1.0000000 
# 2:  1  8.106 0.00000000 0.9453393 
# 3:  1  8.106 0.37368421 0.0000000 
# 4:  2  8.106 0.01151461 0.0000000 
# 5:  2  8.106 0.00000000 1.0000000 
# 6:  2  8.106 1.00000000 0.2055018 

Beachten Sie, dass Ihre Normalisierung Probleme haben wird, wenn nur eine Zeile für einen Speicher vorhanden ist.

+0

Nice Lösung @ Jlhoward. Ich nehme an, dass Arbeitslosigkeit zur Liste hinzugefügt wird, damit sie nicht fallengelassen wird. Nur aus Neugier, wie würden Sie die Arbeitslosigkeit behalten, wenn sie nicht in jedem Geschäft konstant wäre und trotzdem das gewünschte Ergebnis erzielt? – Vincent

+0

OP möchte 1 Zeile pro Store. Wenn die Arbeitslosigkeit für ein bestimmtes Geschäft nicht konstant ist, welchen Wert würden Sie verwenden? – jlhoward

+0

Ich frage mich, ob es drei Zeilen pro Geschäft gibt (wie in OPs gewünschter Ausgabe), wie würdest du Arbeitslosigkeit behalten wenn nicht durch = list(). – Vincent

Verwandte Themen