【问题标题】:Normalize By Group for All Columns按组对所有列进行归一化
【发布时间】:2018-10-24 05:58:54
【问题描述】:

我有一个包含 400 多列的数据集。我想在此计算中排除前两列,但我想将其包含在我的最终输出中。

对于列 3:ncol(df),如何按组进行归一化?

这是我现在所拥有的,但它给了我一个错误,同时运行需要很长时间:

library(BBmisc)
test<-df %>% 
group_by(group) %>% 
mutate_all(.vars = df[3:ncol(df)], 
           funs(normalize))

我希望能够将范围设置为 0 到 5。

这是我的数据集的样子:

df
group    week    col3     col4    col5 ......
    A       1      25       56      87 ......
    A       2      21       34      98 ......
    A       3      34       67     100 ......
    B       1      11      120    1000 ......
    B       2       8      340    1200 ......
    B       3       2      560    2000 ......

我想按组应用从第 3 列开始的归一化函数(没有硬编码到 col3 到 col5,因为我总共有 400 列)

【问题讨论】:

    标签: r dplyr normalization


    【解决方案1】:

    我们需要mutate_at

    df %>% 
      group_by(group) %>% 
      mutate_at(vars(-one_of("week")), normalize)
    # A tibble: 6 x 5
    # Groups:   group [2]
    #  group  week   col3   col4   col5
    #  <chr> <int>  <dbl>  <dbl>  <dbl>
    #1 A         1 -0.250  0.218 -1.14 
    #2 A         2 -0.851 -1.09   0.429
    #3 A         3  1.10   0.873  0.714
    #4 B         1  0.873 -1     -0.756
    #5 B         2  0.218  0     -0.378
    #6 B         3 -1.09   1      1.13 
    

    正如 cmets 中提到的,如果我们使用索引范围,那么应该小心mutate_at。目前,索引在没有group_by 列的情况下开始。所以,如果我们想传递一个索引范围,从开始和停止位置减去一个

    df %>%
        group_by(group) %>%
        mutate_at(vars((3-1):(ncol(.)-1)), normalize)
    # A tibble: 6 x 5
    # Groups:   group [2]
    #  group  week   col3   col4   col5
    #  <chr> <int>  <dbl>  <dbl>  <dbl>
    #1 A         1 -0.250  0.218 -1.14 
    #2 A         2 -0.851 -1.09   0.429
    #3 A         3  1.10   0.873  0.714
    #4 B         1  0.873 -1     -0.756
    #5 B         2  0.218  0     -0.378
    #6 B         3 -1.09   1      1.13 
    

    数据

    df <- structure(list(group = c("A", "A", "A", "B", "B", "B"), week = c(1L, 
    2L, 3L, 1L, 2L, 3L), col3 = c(25L, 21L, 34L, 11L, 8L, 2L), col4 = c(56L, 
    34L, 67L, 120L, 340L, 560L), col5 = c(87L, 98L, 100L, 1000L, 
    1200L, 2000L)), class = "data.frame", row.names = c(NA, -6L))
    

    【讨论】:

    • vars 是不必要的
    • @Ryan 用于一般情况
    • 我在尝试此操作时收到此错误:Error in combine_vars(vars, ind_list) : Position must be between 0 and n
    • @nak5120 使用mutate_at,当我们指定列索引时,需要小心,因为“组”列根本不包括在内。一种选择是指定列名或不感兴趣的列
    • 谢谢@akrun,感激不尽
    猜你喜欢
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2017-06-27
    • 2018-05-21
    • 2020-08-15
    • 2021-02-09
    相关资源
    最近更新 更多