【问题标题】:Pass multiple columns in dataframe into function at once in R在R中一次将数据框中的多列传递给函数
【发布时间】:2018-11-17 13:47:59
【问题描述】:

经过大量搜索,我似乎无法弄清楚这一点。 尝试编写一个函数:

  • 获取一个数据帧,db
  • 按 var1 对数据框进行分组
  • 按组返回几个不同列的平均值和标准差

这是我的功能,

myfun <- function(db,var1, ...) {

  var1 <- enquo(var1)
  var2 <- quos(...)

  for (i in var2) {

  db %>% 
    group_by(!!var1) %>%       
    summarise(mean_var = mean(!!!var2))

}}

当我通过以下时,什么都没有返回

myfun(data, group, age, bmi)

理想情况下,我想按组对年龄和 bmi 进行分组,并返回每个的平均值和标准差。将来,我想将更多列从数据传递到函数中......

输出与 doby 包中的 summaryBy 类似,但同时出现在多个列上,如下所示:

Group   age.mean    age.sd
0
1
        bmi.mean    bmi.sd
0
1

【问题讨论】:

    标签: r function for-loop dplyr


    【解决方案1】:

    您的循环似乎是不必要的(您没有对i 做任何事情)。相反,您可以使用summarize_at 来实现您想要的效果:

    myfun <- function(db,var1, ...) {
    
      var1 <- enquo(var1)
      var2 <- quos(...)
    
        db %>% 
          group_by(!!var1) %>%       
          summarise_at(vars(!!!var2), c(mean = mean, sd = sd))
    
      }
    

    如果我们用 diamonds 数据集对其进行测试:

    myfun(diamonds, cut, x, z)
    
      cut       x_mean z_mean  x_sd  z_sd
      <ord>      <dbl>  <dbl> <dbl> <dbl>
    1 Fair        6.25   3.98 0.964 0.652
    2 Good        5.84   3.64 1.06  0.655
    3 Very Good   5.74   3.56 1.10  0.730
    4 Premium     5.97   3.65 1.19  0.731
    5 Ideal       5.51   3.40 1.06  0.658
    

    为了使格式更接近您在原始帖子中的想法,我们可以使用一点 tidyr 魔法:

    myfun <- function(db,var1, ...) {
    
      var1 <- enquo(var1)
      var2 <- quos(...)
    
      db %>% 
        group_by(!!var1) %>%       
        summarise_at(vars(!!!var2), c(mean = mean, sd = sd)) %>% 
        gather(variable, value, -(!!var1)) %>% 
        separate(variable, c('variable', 'measure'), sep = '_') %>% 
        spread(measure, value) %>% 
        arrange(variable, !!var1)
    
    }
    
       cut       variable  mean    sd
       <ord>     <chr>    <dbl> <dbl>
     1 Fair      x         6.25 0.964
     2 Good      x         5.84 1.06 
     3 Very Good x         5.74 1.10 
     4 Premium   x         5.97 1.19 
     5 Ideal     x         5.51 1.06 
     6 Fair      z         3.98 0.652
     7 Good      z         3.64 0.655
     8 Very Good z         3.56 0.730
     9 Premium   z         3.65 0.731
    10 Ideal     z         3.40 0.658
    

    【讨论】:

    • 这个解决方案对我来说效果很好。你能解释一下我如何将每列的平均值和标准差输出为类似于原始帖子的格式吗? (更垂直对齐?,也许每个结果都作为矩阵输出?)。如果我输入更多列(x、y、z、a、b、c 等),结果将很难水平阅读
    • 这正是我一直在寻找的,而且效果很好。我从这个答案中学到了很多东西。
    猜你喜欢
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2019-08-12
    相关资源
    最近更新 更多