使用summarise_each减去某些行的平均值

时间:2016-07-14 16:31:39

标签: r dplyr

我有一个包含30个变量的数据集。其中一个是指标变量(0或1),我想减去某些列标签为1的那些行的平均值(类似于居中但取某些行的平均值而不是整列的平均值)。

Input      |    Output
1234       |    000001234
393939392  |    393939392
5          |    000000005

对于上述数据集,我想对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]

第2栏的预期输出:

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

我一直在尝试使用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

感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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