按值进行子集化后修改列

J. *_*ost 5 r dplyr

我有一个大型数据框,并希望标准化多个列,同时调整值的均值和标准偏差.假设我有以下示例数据:

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))
Run Code Online (Sandbox Code Playgroud)

并且想要将每个s1-s3标准化,同时将平均值和标准差调整为状态== 0.如果我这样说,s1只能我做以下事情:

df = df %>% group_by(sample) %>%
  mutate(sd_s1 = (s1 - mean(s1[status==0])) / sd(s1[status==0]))
Run Code Online (Sandbox Code Playgroud)

但是当我必须在多个列上执行此操作时,我的问题出现了.我尝试编写一个包含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)
Run Code Online (Sandbox Code Playgroud)

这只是为s1-s3创建Na值.我试图使用以下提供的答案: R - dplyr - mutate - 使用动态变量名称,但无法弄清楚如何进行子集化.

任何帮助是极大的赞赏.谢谢!

akr*_*run 2

我们可以使用

df %>%
  group_by(sample) %>% 
  mutate_at(vars(s1:s3), funs((.- mean(.[status == 0]))/sd(.[status == 0])))
Run Code Online (Sandbox Code Playgroud)