我有一个包含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
感谢任何帮助。谢谢!
答案 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