r - 按值进行子集化后改变列

标签 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))

并希望标准化每个 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 ,但无法弄清楚如何进行子集化。

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

最佳答案

我们可以用

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

关于r - 按值进行子集化后改变列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46077362/

相关文章:

r - 从包含间隙的序列中获取开始和结束范围

r - 按组左连接(或等效)到数字索引

r - 如何对整个数据框使用 case_when?

r - (1-previous_record)*current_record 的累积积

R - dplyr - mutate_if 多个条件

r - 多个变量的自定义函数

随机分配两个数字到数据帧

r - 如何在 RMarkdown 中生成带有标题的分页表?

r - 如何从 GLM 输出中获取概率

r - 计算R中向量中重复数字序列的长度