Изменены некоторые столбцы до указанного c среднего значения и стандартного отклонения в R - PullRequest
0 голосов
/ 04 апреля 2020

С учетом следующего кадра данных, как я могу изменить масштаб v5, чтобы mean было 100, а standard deviation было 15?

head(df, n=5)

Out:

v1  v2    v3   v4   v5 
65  1   121.12  4   27
98  1   89.36   4   25
85  1   115.44  4   27
83  1   99.45   3   25
115 1   92.75   4   27
98  0   107.90  1   18

Я пробовал с пакетом psych, но последний df неверен для последнего столбца:

library(psych)
library(tidyverse)
v5.rescaled <- df %>% rescale(df$v5, mean = 100, sd = 15)
df$v5.rescaled

Out:

t.t.scale.x.....sd...mean.
121.11985               
89.35994                
115.43986               
99.44991                
92.74993                

Но head(df, n=5) неверно для измененных размеров v5:

    v1  v2     v3   v4  v5        v5.rescaled
1   65  1   121.12  4   27  <data.frame [5 × 1]>
2   98  1   89.36   4   25  <data.frame [5 × 1]>
3   85  1   115.44  4   27  <data.frame [5 × 1]>
4   83  1   99.45   3   25  <data.frame [5 × 1]>
5   115 1   92.75   4   27  <data.frame [5 × 1]>

1 Ответ

2 голосов
/ 04 апреля 2020
  1. Пожалуйста, попробуйте опубликовать действительное представление в следующий раз. Это избавит других от необходимости вручную воспроизводить ваши входные данные. Кроме того, не сразу понятно, как ваш первый фрагмент кода, ссылающийся на df со столбцами v1 - v5, относится к последующему фрагменту кода, ссылающемуся на df$mother.iq.
  2. В файле справки для psych::rescale() конкретно указано, что вход x должен представлять собой матрицу или фрейм данных . Я подозреваю, что именно поэтому вы получаете не то, что ожидали.
  3. Хотя вы можете использовать psych::rescale(), лучшая альтернатива, обеспечивающая большую гибкость, может заключаться в том, чтобы предвосхитить go дополнительную зависимость от пакета {psych} в целом и вместо этого просто вручную изменить масштаб столбцов по мере необходимости. Два подхода проиллюстрированы на следующем рисунке:
# load libraries
library(tidyverse)

# define data as per OP
df <- data.frame(
          v1 = c(65L, 98L, 85L, 83L, 115L, 98L),
          v2 = c(1L, 1L, 1L, 1L, 1L, 0L),
          v3 = c(121.12, 89.36, 115.44, 99.45, 92.75, 107.9),
          v4 = c(4L, 4L, 4L, 3L, 4L, 1L),
          v5 = c(27L, 25L, 27L, 25L, 27L, 18L)
)

# rescale via psych::rescale using entire data frame
df %>% psych::rescale(mean = 100, sd = 15)
#>          v1        v2        v3        v4        v5
#> 1  77.38682 106.12372 119.90143 108.25723 109.31746
#> 2 106.46091 106.12372  82.24089 108.25723 100.71673
#> 3  95.00748 106.12372 113.16617 108.25723 109.31746
#> 4  93.24541 106.12372  94.20546  95.87139 100.71673
#> 5 121.43847 106.12372  86.26070 108.25723 109.31746
#> 6 106.46091  69.38138 104.22535  71.09970  70.61416

# if you only want to do this for specific columns, do it manually by targeting
# columns using dplyr::mutate_at(), an anonymous function, and scale (from base
# R):
df %>% 
  mutate_at(vars(v4, v5), function(x) scale(x)*15 + 100)
#>    v1 v2     v3        v4        v5
#> 1  65  1 121.12 108.25723 109.31746
#> 2  98  1  89.36 108.25723 100.71673
#> 3  85  1 115.44 108.25723 109.31746
#> 4  83  1  99.45  95.87139 100.71673
#> 5 115  1  92.75 108.25723 109.31746
#> 6  98  0 107.90  71.09970  70.61416
...