2016-08-09 21 views
0

Ich habe Probleme mit der Standardisierung von Datenspalten in R in Untergruppen.Standardisieren Daten Spalten in R in Untergruppen

Ich habe den Datenrahmen:

df<-data.frame(
salesPerson=sample(c('Alan','Bob','Cindy'),20 ,replace=TRUE) 
, quater=sample(c('Q1','Q2','Q3'),20 ,replace=TRUE) 
,salesValue=runif(20, 5.0, 7.5) 
) 

I mit skalierten Werten von Verkaufs zusätzliche Spalte mit dem Datenrahmen hinzufügen möchten.

alle Spalte skalieren I-Code verwenden können:

df$salesValueScaled<-scale(df$salesValue) 

Das Problem ist, dass ich möchte Verkäufe für jede Kombination von Spalten Verkäufer und quater abtrennbar skalieren. Sth wie:

df$salesValueScaled<-scale(df$salesValue, by =c(df$salesPerson,df$quater)) 

Ich habe auf diesem Forum für diese Lösung gesucht, aber ich konnte keine Lösung für dieses Problem finden.

Vielen Dank im Voraus für Hilfe.

+5

'Bibliothek (dplyr); df%>% group_by (salesPerson, quater)%>% muate (skaliertes_Col = scale (salesValue)) '? – Abdou

+0

@michalk Sie möchten vielleicht ein Tutorial zu 'dplyr' und/oder' data.table' lesen. Beide Pakete machen so etwas gut. – steveb

+0

@Abdou: fast ideal, aber wenn es nur eine Beobachtung in der Teilmenge gibt, dann habe ich Na. – michalk

Antwort

1

Sie können dplyr für diesen Einsatz:

library(dplyr) 

new_df <- df %>% group_by(salesPerson, quater) %>% 
    mutate(scaled_Col = scale(salesValue)) %>% 
    ungroup 

Reihen zu umgehen, die NA s zurückkehren, können Sie entweder die ursprünglichen Werte behalten, wie sie sie sind oder auszufiltern, bevor die Skalierung:

die Keeping Originalwerte (nur Instanzen halten Skalierung wo NROW größer als 1 ist):

new_df <- df %>% group_by(salesPerson, quater) %>% 
    mutate(scaled_Col = ifelse(NROW(salesValue) > 1, scale(salesValue), salesValue)) %>% 
    ungroup 

Filtern sie aus (wie von @ steveb vorgeschlagen):

new_df <- df %>% group_by(salesPerson, quater) %>% 
    filter(n() > 1) %>% 
    mutate(scaled_Col = scale(salesValue)) %>% 
    ungroup 

Ich hoffe, das hilft.