【问题标题】:Count multiple z-scores by two groups with Dplyr mutate Dapply/Lapply使用 Dplyr mutate Dapply/Lapply 计算两组的多个 z 分数
【发布时间】:2017-10-26 16:09:35
【问题描述】:

我正在尝试按两组计算多个变量的 Z 分数。

这是一个例子:

数据 = mtcars

我想获得 Z 分数的变量:

vars <- c("mpg", "disp", "hp", "drat", "wt", "qsec")

计算一个变量的 z 分数(工作):

mtcars %>% group_by(am, vs) %>% mutate(z_mpg = (mpg - mean(mpg)) / sd(mpg))

问题是我无法让 dapply 或 lapply 处理以前的代码来运行所有“vars”变量,所以我会一次获得所有 Z 分数。

如果您知道如何在考虑组而不是 z 得分的同时对数据进行归一化(平均值 0,SD 1),这对我也有帮助。

谢谢!

【问题讨论】:

    标签: apply normalization dplyr


    【解决方案1】:

    您可以使用mutate_atfuns 来定义您的z-score 函数。在这种情况下,它使用. 来指示您正在变异的列。

    mtcars %>%
      group_by(am, vs) %>%
      mutate_at(.cols = vars, funs(z = (. - mean(.)) / sd(.)))
    
    Source: local data frame [32 x 17]
    Groups: am, vs [4]
    
         mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb     mpg_z_    disp_z_      hp_z_    drat_z_       wt_z_     qsec_z_
       <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>      <dbl>      <dbl>      <dbl>      <dbl>       <dbl>       <dbl>
    1   21.0     6 160.0   110  3.90 2.620 16.46     0     1     4     4  0.3118089 -0.4852978 -0.7168218 -0.1024154 -0.48795905  0.60787578
    2   21.0     6 160.0   110  3.90 2.875 17.02     0     1     4     4  0.3118089 -0.4852978 -0.7168218 -0.1024154  0.03595488  1.12105734
    3   22.8     4 108.0    93  3.85 2.320 18.61     1     1     4     1 -1.1710339  0.9679756  0.5147599 -0.7890520  0.66286051 -0.09519147
    4   21.4     6 258.0   110  3.08 3.215 19.44     1     0     3     1  0.2659345  1.6870444  0.3753676 -1.0547191  0.05956492 -0.36000354
    5   18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     2  1.3156017  0.0331832 -0.5745432  0.1266602 -0.86434641 -0.15281032
    6   18.1     6 225.0   105  2.76 3.460 20.22     1     0     3     1 -1.0695190  1.0153670  0.1364973 -1.7435153  0.76407410  0.17268463
    7   14.3     8 360.0   245  3.21 3.570 15.84     0     0     3     4 -0.2703291  0.0331832  1.5237884  0.3872184 -0.69514319 -1.62477907
    8   24.4     4 146.7    62  3.69 3.190 20.00     1     0     4     2  1.4799831 -0.5783405 -1.9177872  0.2582986 -0.01232378  0.02243925
    9   22.8     4 140.8    95  3.92 3.150 22.90     1     0     4     2  0.8324905 -0.6984282 -0.3412433  0.7533708 -0.12734568  2.00294653
    10  19.2     6 167.6   123  3.92 3.440 18.30     1     0     4     4 -0.6243679 -0.1529447  0.9964304  0.7533708  0.70656315 -1.13854778
    # ... with 22 more rows
    

    【讨论】:

    • 谢谢! @Jake Kaupp,这行得通!我可以像这样使用它来规范化数据吗? mtcars %&gt;% group_by(am, vs) %&gt;% mutate_at(.cols = vars, funs(n= (. - min(.)) / (max(.)-min(.))))
    • 如果你花时间写出代码,你应该知道它是否有效!
    猜你喜欢
    • 2019-04-26
    • 2019-07-03
    • 1970-01-01
    • 2021-04-23
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多