R 使用每个汇总_减去某些行的平均值

R 使用每个汇总_减去某些行的平均值,r,dplyr,R,Dplyr,我有一个包含30个变量的数据集。其中之一是一个指示符变量(0或1),我想减去某些列中标签为1的行的平均值(类似于居中,但取某些行的平均值,而不是整个列的平均值) 对于上述数据集,我想对Col2:Col4执行以下操作: x(i,j)-x'(,j) 其中,x(i,j)表示一个单元格,x'(,j)表示列中label=1的行的平均值。例如,对于[3,1],它应该是 (565平均值(400131))=299.5 第2列的预期输出: Col2 134.5 -134.5 299.5 -144.5 56.5

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

对于上述数据集,我想对
Col2:Col4
执行以下操作:

x(i,j)-x'(,j)
其中,
x(i,j)
表示一个单元格,
x'(,j)
表示列中
label=1的行的平均值。例如,对于
[3,1]
,它应该是

(565平均值(400131))=299.5

第2列的预期输出:

Col2
134.5
-134.5
299.5
-144.5
56.5
279.5
我一直在尝试使用
summary_each
命令,但到目前为止都没有成功。我的命令是

try<- group_by(data,lbl) %>% select(c(4,13:26)) %>% summarise_each(funs((.)-(mean(data[data$lbl==1,])))
try%select(c(4,13:26))%>%summary_每个(funs((.)-(平均值[数据$lbl==1,]))
但是这会生成
NA
,我不确定我到底错在哪里(我确定是在
总结每个
命令中,我无法正确使用
funs()


非常感谢您的帮助。谢谢!

以下是我的做法:

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
#    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

另一种方法(无可否认更加复杂):


也许是最具dplyr风格的方法(受此启发):


请阅读关于和如何给出a的信息。这将使其他人更容易帮助您。@Draylatus Maximus我已编辑了问题,希望这能使问题更清楚。谢谢!您想要列的平均值,但不需要
label==1
?@StevenBeaupréNo,对于每列,我想减去行f的平均值或者哪个标签==1。因此,列的总和(不包括
标签==1
)减去
标签==1
的平均值?请提供您的预期输出。哇。触摸!非常聪明的方法。
library(purrr)

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