R 使用每个汇总_减去某些行的平均值
我有一个包含30个变量的数据集。其中之一是一个指示符变量(0或1),我想减去某些列中标签为1的行的平均值(类似于居中,但取某些行的平均值,而不是整个列的平均值) 对于上述数据集,我想对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
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