在R中将dataframe中的多个列同时传递给函数

在R中将dataframe中的多个列同时传递给函数,r,function,for-loop,dplyr,R,Function,For Loop,Dplyr,经过多次搜索,我似乎无法找到答案。 正在尝试编写以下函数: 获取一个数据帧,db 按var1对数据帧进行分组 按组返回多个不同列上的平均值和sd 这是我的功能 myfun <- function(db,var1, ...) { var1 <- enquo(var1) var2 <- quos(...) for (i in var2) { db %>% group_by(!!var1) %>% summaris

经过多次搜索,我似乎无法找到答案。 正在尝试编写以下函数:

  • 获取一个数据帧,db
  • 按var1对数据帧进行分组
  • 按组返回多个不同列上的平均值和sd
这是我的功能

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

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

  for (i in var2) {

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

}}
理想情况下,我希望将年龄和bmi分组,并返回每个组的平均值和sd。将来,我希望将更多的列从数据传递到函数中

输出类似于doby package中的summaryBy,但同时在多个列上显示,如下所示:

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

您的循环似乎没有必要(您没有使用
i
执行任何操作)。相反,您可以使用
summary_at
实现您想要的效果:

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

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

    db %>% 
      group_by(!!var1) %>%       
      summarise_at(vars(!!!var2), c(mean = mean, sd = sd))

  }
myfun%
单独的(变量,c('variable','measure'),sep=''.''''''''>%
排列(测量值、值)%>%
排列(变量,!!var1)
}
切割变量平均值sd
1公平x 6.25 0.964
2好x 5.84 1.06
3非常好x 5.74 1.10
4高级x 5.97 1.19
5理想x 5.51 1.06
6公平z 3.98 0.652
7良好z 3.64 0.655
8非常好z 3.56 0.730
9高级z 3.65 0.731
10理想z 3.40 0.658

您的循环似乎没有必要(您没有使用
i
执行任何操作)。相反,您可以使用
summary_at
实现您想要的效果:

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

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

    db %>% 
      group_by(!!var1) %>%       
      summarise_at(vars(!!!var2), c(mean = mean, sd = sd))

  }
myfun%
单独的(变量,c('variable','measure'),sep=''.''''''''>%
排列(测量值、值)%>%
排列(变量,!!var1)
}
切割变量平均值sd
1公平x 6.25 0.964
2好x 5.84 1.06
3非常好x 5.74 1.10
4高级x 5.97 1.19
5理想x 5.51 1.06
6公平z 3.98 0.652
7良好z 3.64 0.655
8非常好z 3.56 0.730
9高级z 3.65 0.731
10理想z 3.40 0.658

这个解决方案对我很有效。你能解释一下我是如何将每一列的平均值和标准差按组输出为一种类似于原始文章的格式的吗?(更垂直对齐?可能每个结果都作为矩阵输出?)。如果我输入更多的列(x、y、z、a、b、c等),结果将很难水平读取这正是我所寻找的,并且效果很好。我从这个答案中学到了很多。这个解决方案对我很有效。你能解释一下我是如何将每一列的平均值和标准差按组输出为一种类似于原始文章的格式的吗?(更垂直对齐?可能每个结果都作为矩阵输出?)。如果我输入更多的列(x、y、z、a、b、c等),结果将很难水平读取这正是我所寻找的,并且效果很好。我从这个答案中学到了很多。
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
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