使用循环生成汇总函数参数

时间:2019-04-03 05:25:57

标签: r loops dplyr

我有一个类似这样的数据。

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软件包中的summary函数汇总此数据。

我有一个参数太多的问题。

例如

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

1 个答案:

答案 0 :(得分:0)

您不能在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

编辑

n() / summarise_all中使用summarise_if时会遇到问题,因为它会自动尝试将参数na.rm = TRUE强制插入n()中。反过来会引发错误,因为n()没有此参数。但是,您可以使用此黑客(摘自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