2016-07-14 101 views
1

我有一個包含30個變量的數據集。其中之一是一個指示變量(0或1),我想減去那些行的標籤爲1的行的平均值(類似於居中,但取某些行的平均值而不是整列)。使用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  

對於上述數據集,我想爲Col2:Col4執行以下操作:

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

其中x(i,j)代表的細胞,和x'(,j)代表行的在列的平均值爲哪些label=1 。對於e.g,爲[3,1]應該

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

的第2列的預期輸出:

Col2 
134.5 
-134.5 
299.5 
-144.5 
56.5 
279.5 

我一直在嘗試使用summarise_each命令,但沒有成功到現在。我給的命令是

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

但這產生NA,我真的不知道我要去哪裏錯了(我敢肯定,這在summarise_each命令,其中我不能圖瞭解如何正確使用funs()

任何幫助表示讚賞。謝謝!

+1

請閱讀有關的信息[如何問一個好問題](http://stackoverflow.com/help/how-to-ask)以及如何給出一個[可重現的例子](http:// s tackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610)。這會讓其他人更容易幫助你。 – Jaap

+0

@ProcrastinatusMaximus我編輯了這個問題,我希望這可以讓它更清晰。謝謝! –

+0

你想要列的平均值,但沒有值'標籤== 1'? –

回答

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

哇。 Touché!非常聰明的做法。 –

+0

謝謝......史蒂文! – eipi10

1

這是我會怎麼做:

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

其中給出:

# 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 

另一種方法(當然更令人費解):

library(purrr) 

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

也許是最dplyr -esque方法(通過此post啓發):

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

df %>% 
    mutate_each(funs(. - cm$.), -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 
相關問題