2016-07-14 4 views
1

У меня есть набор данных с 30 переменными. Одна из них - индикаторная переменная (0 или 1), и я хотел бы вычесть среднее из тех строк, где метка равна 1 для определенных столбцов (что-то вроде центрирования, но с учетом значения некоторых строк вместо всего столбца).Вычитание среднего числа строк с помощью summaryise_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 , Для например, для [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

Вы хотите, чтобы среднее из столбцов, но без значений, где 'label == 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

Woah. 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 
Смежные вопросы