【发布时间】:2017-09-06 14:05:37
【问题描述】:
我有一个很大的数据框,想要标准化多个列,同时调节值的平均值和标准差。假设我有以下示例数据:
set.seed(123)
df = data.frame("sample" = c(rep(1:2, each = 5)),
"status" = c(0,1),
"s1" = runif(10, -1, 1),
"s2" = runif(10, -5, 5),
"s3" = runif(10, -25, 25))
并希望标准化每个 s1-s3,同时将均值和标准差调节为 status==0。如果我应该这样做,那么只有 s1 我可以做到以下几点:
df = df %>% group_by(sample) %>%
mutate(sd_s1 = (s1 - mean(s1[status==0])) / sd(s1[status==0]))
但是当我必须在多个列上执行此操作时,我的问题就出现了。我尝试编写一个包含 mutate_at 的函数:
standardize <- function(x) {
return((x - mean(x[status==0]))/sd(x[status==0]))
}
df = df %>% group_by(sample) %>%
mutate_at(vars(s1:s3), standardize)
这只会为 s1-s3 创建 Na 值。 我尝试使用以下提供的答案: R - dplyr - mutate - use dynamic variable names,但不知道如何进行子集化。
非常感谢任何帮助。谢谢!
【问题讨论】: