【问题标题】:Generate summarise function parameters using a loop使用循环生成汇总函数参数
【发布时间】:2019-04-03 05:25:57
【问题描述】:

我有一个数据看起来像这样。

data = data.frame(GENDER = c("1", "1", "1", "2", "2"),
                  ZSCORE_0 = c(12.12, 12.67, 13.72, 13.79, 14.78),
                  ZSCORE_3 = ...,
                  ZSCORE_6 = ...,
                  ...
                  ZSCORE = 60 = ...)

我尝试使用 dplyr 包中的汇总函数来汇总这些数据。

我的问题是参数太多。

例如

data %>%
    group_by(GENDER) %>%
    summarise(MIN_ZSCORE_0 = min(ZSCORE_0),
              MIN_ZSCORE_3 = min(ZSCORE_3),
              ...,
              MIN_ZSCORE_60 = min(ZSCORE_60),
              MAX_ZSCORE_0 = max(ZSCORE_0),
              MAX_ZSCORE_3 = max(ZSCORE_3),
              ...,
              MAX_ZSCORE_60 = max(ZSCORE_60),
              MEAN,
              MEDIAN,
              n,
              ...)

我想简化这项工作。

我使用循环来创建参数。

interval = seq(3, 60, 3)

data %>%
    group_by(GENDER) %>%
    summarise(for (i in interval) {
                  target = paste0("ZSCORE_", i)
                  min(target)
                  max(target)
                  ...
                  n(target)
              })

但它不起作用。

Error: Column `for (... in NULL) NULL` is of unsupported type NULL

【问题讨论】:

    标签: r loops dplyr


    【解决方案1】:

    您不能在summarise 中使用循环。但是,请尝试使用summarise_all

    require(tidyverse)
    
    mtcars %>% 
      summarise_all(c("min", "max"))
    

    结果:

      mpg_min cyl_min disp_min hp_min drat_min wt_min qsec_min
    1    10.4       4     71.1     52     2.76  1.513     14.5
      vs_min am_min gear_min carb_min mpg_max cyl_max disp_max
    1      0      0        3        1    33.9       8      472
      hp_max drat_max wt_max qsec_max vs_max am_max gear_max
    1    335     4.93  5.424     22.9      1      1        5
      carb_max
    1        8
    

    编辑

    summarise_all/summarise_if 中使用n() 是一个问题,因为它会自动尝试将参数na.rm = TRUE 强制转换为n()。这反过来会引发错误,因为n() 没有这个参数。但是,您可以使用此 hack(取自 here):

    require(tidyverse)
    
    mtcars %>% 
      summarise_if(is.numeric, c("min", "max")) %>% 
      cbind(summarise_if(mtcars, is.numeric, funs(n())))
    

    结果:

      mpg_min cyl_min disp_min hp_min drat_min wt_min qsec_min
    1    10.4       4     71.1     52     2.76  1.513     14.5
      vs_min am_min gear_min carb_min mpg_max cyl_max disp_max
    1      0      0        3        1    33.9       8      472
      hp_max drat_max wt_max qsec_max vs_max am_max gear_max
    1    335     4.93  5.424     22.9      1      1        5
      carb_max mpg cyl disp hp drat wt qsec vs am gear carb
    1        8  32  32   32 32   32 32   32 32 32   32   32
    

    【讨论】:

    • 感谢您的回答。我可以再问一个问题吗?如何在 summarise_all() 函数中使用“n”与“min”和“max”?
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 2021-11-30
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多