如何对R中具有不同值的多个列重复标准化?

bqjvbblv  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(154)

任务以前我只处理几个变量-通常是5 - 10个,也许还有一个或两个分裂变量。现在变量的数量正在迅速增加,它们正在改变名称。例如,我有这个(虚拟)数据集:

V_1 V_2 V_3 V_4 V_5
1    x   3   3   2   3
2    x   4   4   3   3 
3    x   2   5   4   4
4    x   5   4   5   4
5    t   6   2   4   5
6    t   4   3   5   4
7    t   5   4   4   5
8    t   3   5   6   4
9    s   4   6   2   4
10   s   2   5   4   4
11   s   3   4   3   6
12   s   4   5   4   2
13   r   3   4   5   2
14   r   2   3   4   4
15   r   3   4   4   5
16   r   4   3   4   4

其中V_1是split-variable,我用途:

library(dplyr)

df1 <- data %>%
  group_by(V_1) %>%
  mutate(S_v2=scale(V_2)*2+5.5)
df2 <- df1 %>%
  group_by(V_1) %>%
  mutate(S_v3=scale(V_3)*2+5.5)
df3 <- df2 %>%
  group_by(V_1) %>%
  mutate(S_v4=scale(V_4)*2+5.5)
df4 <- df3 %>%
  group_by(V_1) %>%
  mutate(S_v5=scale(V_5)*2+5.5)

结果会是这样:

V_1     V_2   V_3   V_4   V_5 S_v2[,1] S_v3[,1] S_v4[,1] S_v5[,1]
   <chr> <int> <int> <int> <int>    <dbl>    <dbl>    <dbl>    <dbl>
 1 x         3     3     2     3     4.73     3.05     3.18     3.77
 2 x         4     4     3     3     6.27     5.5      4.73     3.77
 3 x         2     5     4     4     3.18     7.95     6.27     7.23
 4 x         5     4     5     4     7.82     5.5      7.82     7.23
 5 t         6     2     4     5     7.82     3.18     3.93     7.23
 6 t         4     3     5     4     4.73     4.73     6.02     3.77
 7 t         5     4     4     5     6.27     6.27     3.93     7.23
 8 t         3     5     6     4     3.18     7.82     8.11     3.77
 9 s         4     6     2     4     7.07     7.95     2.89     5.5 
10 s         2     5     4     4     2.89     5.5      7.07     5.5 
11 s         3     4     3     6     4.98     3.05     4.98     7.95
12 s         4     5     4     2     7.07     5.5      7.07     3.05
13 r         3     4     5     2     5.5      7.23     8.5      2.72
14 r         2     3     4     4     3.05     3.77     4.5      5.90
15 r         3     4     4     5     5.5      7.23     4.5      7.49
16 r         4     3     4     4     7.95     3.77     4.5      5.90

这是通过split-variable标准化每个变量的10分制。到目前为止还不错(如果你只有几个变量......)。现在,我有300多个变量,并且来自不同数据集的变量名称不断变化,如果我按照我的老套路,这项任务相当乏味。
我已经看过各种循环函数,但还没有设法把事情做好。数据集不断增长,我的老板变得不耐烦了。最终目标是使用可以自动化这些事情的代码。有人能帮我吗?

这是我需要的:

df <- data %>%
  group_by(colname_1) %>%
  mutate(S_colname = scale(colname)*2+5.5)
Repeat this block of code with the same group_by but with different 
colnames
am46iovg

am46iovg1#

使用across

data %>%
  group_by(V_1) %>%
  mutate(across(everything(), ~ c(scale(.)) * 2 + 5.5, .names = "S_{.col}")) %>%
  ungroup()
# # A tibble: 16 × 9
#    V_1     V_2   V_3   V_4   V_5 S_V_2 S_V_3 S_V_4 S_V_5
#    <chr> <int> <int> <int> <int> <dbl> <dbl> <dbl> <dbl>
#  1 x         3     3     2     3  4.73  3.05  3.18  3.77
#  2 x         4     4     3     3  6.27  5.5   4.73  3.77
#  3 x         2     5     4     4  3.18  7.95  6.27  7.23
#  4 x         5     4     5     4  7.82  5.5   7.82  7.23
#  5 t         6     2     4     5  7.82  3.18  3.93  7.23
#  6 t         4     3     5     4  4.73  4.73  6.02  3.77
#  7 t         5     4     4     5  6.27  6.27  3.93  7.23
#  8 t         3     5     6     4  3.18  7.82  8.11  3.77
#  9 s         4     6     2     4  7.07  7.95  2.89  5.5 
# 10 s         2     5     4     4  2.89  5.5   7.07  5.5 
# 11 s         3     4     3     6  4.98  3.05  4.98  7.95
# 12 s         4     5     4     2  7.07  5.5   7.07  3.05
# 13 r         3     4     5     2  5.5   7.23  8.5   2.72
# 14 r         2     3     4     4  3.05  3.77  4.5   5.90
# 15 r         3     4     4     5  5.5   7.23  4.5   7.49
# 16 r         4     3     4     4  7.95  3.77  4.5   5.90

c(..)的使用是对列缩放的结果进行解矩阵(您注意到您的结构中嵌入了矩阵吗?)。
如果您使用的是dplyr_1.1.0或更高版本,则可以将其稍微缩短为

data %>%
  mutate(
    across(everything(), ~ c(scale(.)) * 2 + 5.5, .names = "S_{.col}"),
    .by = V_1
  )
afdcj2ne

afdcj2ne2#

或者用旋转的方法把它变得更复杂:注意:@r2evans在1行中做了什么,我们需要6行。

library(tdiyr)
library(dplyr)

df %>% 
  pivot_longer(-V_1) %>% 
  mutate(value_S = scale(value)*2 + 5.5, .keep="unused") %>% 
  group_by(name) %>% 
  mutate(id = row_number()) %>% 
  pivot_wider(names_from = name, values_from = value_S, names_prefix = "S_") %>% 
  cbind(df[-1])
V_1 id    S_V_2    S_V_3    S_V_4    S_V_5 V_2 V_3 V_4 V_5
1    x  1 3.889283 3.889283 2.014993 3.889283   3   3   2   3
2    x  2 5.763572 5.763572 3.889283 3.889283   4   4   3   3
3    x  3 2.014993 7.637861 5.763572 5.763572   2   5   4   4
4    x  4 7.637861 5.763572 7.637861 5.763572   5   4   5   4
5    t  5 9.512150 2.014993 5.763572 7.637861   6   2   4   5
6    t  6 5.763572 3.889283 7.637861 5.763572   4   3   5   4
7    t  7 7.637861 5.763572 5.763572 7.637861   5   4   4   5
8    t  8 3.889283 7.637861 9.512150 5.763572   3   5   6   4
9    s  9 5.763572 9.512150 2.014993 5.763572   4   6   2   4
10   s 10 2.014993 7.637861 5.763572 5.763572   2   5   4   4
11   s 11 3.889283 5.763572 3.889283 9.512150   3   4   3   6
12   s 12 5.763572 7.637861 5.763572 2.014993   4   5   4   2
13   r 13 3.889283 5.763572 7.637861 2.014993   3   4   5   2
14   r 14 2.014993 3.889283 5.763572 5.763572   2   3   4   4
15   r 15 3.889283 5.763572 5.763572 7.637861   3   4   4   5
16   r 16 5.763572 3.889283 5.763572 5.763572   4   3   4   4

相关问题