【问题标题】:mutate columns after subsetting by value按值子集后改变列
【发布时间】: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,但不知道如何进行子集化。

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用

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

    【讨论】:

    • 感谢您的出色回答。有没有办法创建多个新列,例如sd_s1, sd_s2, ...,同时使用mutate_at 函数保留原始列,例如s1, s2, ...
    • @ycw 谢谢,你可以使用df %&gt;% group_by(sample) %&gt;% mutate_at(vars(s1:s3), funs(sd = (.- mean(.[status == 0]))/sd(.[status == 0])))
    • 这很棒。再次感谢。
    • @J.Debost 您的代码对我不起作用。 df[,3:ncol(df)] %&gt;% mutate_all(standardize)# Error in mutate_impl(.data, dots) : Evaluation error: object 'status' not found.你的dplyr是什么版本的?我正在使用 0.7.2。 . 指的是 vars 中指定的各个列
    • 很抱歉造成混乱!您的代码按预期的方式运行,仅使用控件中的均值和 sd(状态 == 0)按组标准化指定的列。简单高效!非常感谢您的帮助。我已经删除了我之前的两个 cmets。
    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 2021-09-15
    • 1970-01-01
    • 2018-08-30
    • 2018-05-31
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多