2017-01-20 2 views
2

Ich habe einen Datenrahmen ähnlich wie dieseMaßstab alle Werte auf Gruppe je

ID <- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3) 
p1 <- c(21000, 23400, 26800, 2345, 23464, 34563, 456433, 56543, 34543,3524, 353, 3432, 4542, 6343, 4534) 
p2 <- c(234235, 2342342, 32, 23432, 23423, 2342342, 34, 2343, 23434, 23434, 34, 234, 2343, 34, 5) 
my.df <- data.frame(ID, p1, p2) 

Nun möchte Ich mag die Werte in p1 skalieren und p2 auf ihre ID abhängig. Es wird also nicht die ganze Spalte wie bei der tapply() -Funktion skaliert, sondern die Skalierung erfolgt für alle Werte für ID 1 einmal, für alle Werte für ID 2 usw. Gleiches gilt für die Skalierung von p2. Der neue Datenrahmen sollte aus den skalierten Werten bestehen.

Ich habe bereits versucht

df_scaled <- ddply(my.df, my.df$ID, scale(my.df$p1)) 

aber die Fehlermeldung

.fun is not a function. 

Vielen Dank für Ihre Hilfe bekommen!

Antwort

1

dplyr macht dies einfach:

ID <- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3) 
p1 <- c(21000, 23400, 26800, 2345, 23464, 34563, 456433, 56543, 34543,3524, 353, 3432, 4542, 6343, 4534) 
p2 <- c(234235, 2342342, 32, 23432, 23423, 2342342, 34, 2343, 23434, 23434, 34, 234, 2343, 34, 5) 
my.df <- data.frame(ID, p1, p2) 

library(dplyr) 
df_scaled <- my.df %>% group_by(ID) %>% mutate(p1 = scale(p1), p2=scale(p2)) 

Beachten Sie, dass es einen Fehler in der stabilen Version von dplyr ist, wenn sie mit Skala arbeiten; Möglicherweise müssen Sie auf die Entwicklerversion aktualisieren (siehe Kommentare).

+0

oder allgemeiner 'my.df%>% group_by (ID)%>% mutate_at (vars (Übereinstimmungen ('p')), Spaß (Skala))' – Sotos

+0

Danke. Es funktioniert auf dem Datenrahmen, den ich hier als ein Beispiel aufstellte, aber mit dem realen Datenrahmen erhalte ich den Fehler: Unerwartetes '=' in "skalierte_Data <- predictortable_panel%>% group_by (vorhersagefähige_Panel $ ID)%>% muate (prekordortable_panel $ p1 = "--- irgendeine Idee, warum es nicht das Gleichheitszeichen nimmt? – GNee

+0

Sie sollten den Namen des Datenrahmens innerhalb der' dplyr 'Funktionen nicht wiederholen (dh' prejectorable_panel $ '' entfernen; 'muate (p1 = .. .' etc sollte funktionieren. – mpjdem