2016-07-14 9 views
1

Ich habe einen Datensatz mit 30 Variablen. Eine davon ist eine Indikatorvariable (0 oder 1), und ich möchte den Mittelwert jener Zeilen abziehen, bei denen die Bezeichnung für bestimmte Spalten 1 ist (etwas wie Zentrierung, aber den Mittelwert bestimmter Zeilen anstelle der gesamten Spalte).Subtrahieren Mittelwert von bestimmten Zeilen mit summarise_each

Col2 Col3 Col4 label 
400 322 345 1  
131 345 809 1  
565 676 311 0  
121 645 777 0  
322 534 263 0  
545 222 111 0  

Für den obigen Datensatz würde Ich mag die folgende Operation für Col2:Col4 auszuführen:

x(i,j)-x'(,j) 

wo x(i,j) eine Zelle, für die und x'(,j) stellt den Mittelwert der Zeilen in der Spalte repräsentiert label=1 . Für z.B. für [3,1] sollte es

sein

(565-mean(400,131))= 299.5

Erwartete Ausgabe für Spalte 2:

Col2 
134.5 
-134.5 
299.5 
-144.5 
56.5 
279.5 

Ich habe versucht, die summarise_each Befehl zu verwenden, haben aber bisher erfolglos geblieben. Der Befehl Ich gebe ist

try<- group_by(data,lbl) %>% select(c(4,13:26)) %>% summarise_each(funs((.)-(mean(data[data$lbl==1,]))) 

Aber das ist NA zu erzeugen und ich bin nicht wirklich sicher, wo ich falsch gehe (ich bin sicher, dass es in dem summarise_each Befehl, wo ich auf Figur nicht in der Lage bin heraus, wie man funs() richtig verwendet)

Jede Hilfe wird geschätzt. Vielen Dank!

+1

Bitte lesen Sie die Informationen über [wie eine gute Frage stellen] (http://stackoverflow.com/help/how-to-ask) und wie man ein [reproduzierbares Beispiel] gibt (http: // s tackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610). Dies wird es anderen sehr erleichtern, Ihnen zu helfen. – Jaap

+0

@ProcrastinatusMaximus Ich habe die Frage bearbeitet und ich hoffe, dies macht es klarer. Vielen Dank! –

+0

Sie wollen den Mittelwert der Spalten, aber ohne Werte wo 'Label == 1'? –

Antwort

2
dat %>% 
    mutate_each(funs(. - mean(.[label==1])), -label) 
Col2 Col3 Col4 label 
1 134.5 -11.5 -232  1 
2 -134.5 11.5 232  1 
3 299.5 342.5 -266  0 
4 -144.5 311.5 200  0 
5 56.5 200.5 -314  0 
6 279.5 -111.5 -466  0 
+0

Woah. Touché! Sehr schlauer Ansatz. –

+0

Danke ... Steven! – eipi10

1

Hier ist, wie ich es tun würde:

sweep(df[1:3], 2, colMeans(df[df$label == 1,][1:3])) 

Welche gibt:

# Col2 Col3 Col4 
#1 134.5 -11.5 -232 
#2 -134.5 11.5 232 
#3 299.5 342.5 -266 
#4 -144.5 311.5 200 
#5 56.5 200.5 -314 
#6 279.5 -111.5 -466 

Einen anderen Ansatz (zugegebenermaßen verschachtelten):

library(purrr) 

df %>% 
    by_row(function(x) { 
    x[1:3] - df %>% 
     filter(label == 1) %>% 
     summarise_each(funs(mean), -label) }, 
    .collate = "cols", 
    .labels = FALSE 
) 

Und vielleicht die dplyr -esque Methode (dieses post inspiriert):

cm <- df %>% 
    filter(label == 1) %>% 
    summarise_each(funs(mean), -label) 

df %>% 
    mutate_each(funs(. - cm$.), -label) 

Welche gibt:

# Col2 Col3 Col4 label 
#1 134.5 -11.5 -232  1 
#2 -134.5 11.5 232  1 
#3 299.5 342.5 -266  0 
#4 -144.5 311.5 200  0 
#5 56.5 200.5 -314  0 
#6 279.5 -111.5 -466  0