Подсчитайте множественные z-значения по двум группам с помощью Dplyr mutate Dapply / Lapply

Я пытаюсь подсчитать Z-баллы для нескольких переменных по двум группам.

Вот пример:

data = 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-значения сразу.

Если у вас есть идея, как это сделать с нормализацией данных (среднее значение 0, SD 1) при учете групп вместо z-оценки, это тоже мне поможет.

Спасибо!


person J5H    schedule 26.10.2017    source источник


Ответы (1)


Вы должны использовать mutate_at и funs, чтобы определить функцию z-показателя. В этом случае используется . для обозначения изменяемого столбца.

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
person Jake Kaupp    schedule 26.10.2017
comment
Спасибо! @ Джейк Каупп, это работает! Могу ли я использовать это для нормализации данных? mtcars %>% group_by(am, vs) %>% mutate_at(.cols = vars, funs(n= (. - min(.)) / (max(.)-min(.)))) - person J5H; 27.10.2017
comment
Если вы потратили время на то, чтобы написать код, вы должны знать, работает ли он! - person Jake Kaupp; 27.10.2017