2016-04-01 20 views
0

Ich möchte Werte in der Spalte eines dataframe basierend auf Werten in einer anderen Spalte skalieren. Zum Beispiel, hier ist ein einfaches BeispielEffiziente Skalierung der Spalte basierend auf dem Wert in einer anderen Spalte in R Datenframe

d<-data.frame(x=runif(5,0,10),y=sample(c(1,2),size=5,replace=TRUE)) 

ergibt die Ausgabe:

  x y 
1 1.0895865 2 
2 0.8261554 2 
3 5.3503761 2 
4 3.3940759 1 
5 6.2786637 1 

ich die x-Werte auf der Grundlage der y-Werte skalieren möchten, also was ich will, ist zu haben:

(x|y=1 - average(x's | y=1))/std.dev(x's|y=1) 

ersetzen dann die x-Werte in d mit den skalierten Werten, die in ähnlicher Weise für x Werte mit y=2.

Was ich bisher getan haben, ist ein bisschen klobig:

 d1<-subset(d,y==1) 
d2<-subset(d,y==2) 

d1$x<-(d1$x-mean(d1$x))/sd(d1$x) 
d2$x<-(d2$x-mean(d2$x))/sd(d2$x) 

und dann verbindlich, alle Ergebnisse in einem großen Datenrahmen, aber das ist ein bisschen langweilig, da meine aktuelle Daten gibt es insgesamt 50 verschiedene Werte für y und ich möchte das für mehrere (verschiedene) Spalten tun.

+1

Bitte fügen Sie 'set.seed()' zu Ihrem Code hinzu, um es reproduzierbar zu machen und die erwartete Ausgabe zu teilen. – mtoto

+0

Vielleicht suchen Sie nach 'ave (d $ x, d $ y, FUN = Funktion (x) (x-Mittelwert (x))/sd (x))'. – nicola

Antwort

2

Sie können diese group_by und mutate vom dplyr Paket mit leicht zu tun:

require(dplyr) 
d %>% 
    group_by(y) %>% 
    mutate(x = (x - mean(x))/sd(x)) 
+0

Könntest du das '%>% erklären warum ist das Format so anders als bei einer normalen Funktion ?? das funktioniert super übrigens! – dimebucker91

+1

'%>%' ist der Verkettungsoperator von 'magrittr'. Es macht es einfacher und besser lesbar, wenn mehrere Funktionen miteinander verknüpft werden. Wenn Sie den obigen Code ohne '%>%' schreiben, wird er 'muate (group_by (d, y), x = (x - mean (x))/sd (x))'. Anstatt 'f (x, y)' zu schreiben, können Sie 'x%>% f (y)' schreiben. Überprüfen Sie auch [hier] (https://github.com/smbache/magrittr) für weitere Informationen. – shadow

1

Diese Aufgabe in der Regel performy von group by in dplyr ist und mit scale

library(dplyr) 
d %>% group_by(y) %>% mutate(x2=scale(x)) 
0

Wir data.table verwenden können. Wir konvertieren den 'data.frame' in 'data.table' (setDT(d)), gruppiert nach 'b', zuweisen (:=) den scale von 'x' zu 'x2'.

setDT(d)[, x2 := scale(x) , by = y] 
+0

Dies bietet keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/11857424) –

+0

@AlessandroCuttin Die Beschreibung hinzugefügt. – akrun

Verwandte Themen