r:dplyr函数,用于生成多组的长格式

r:dplyr函数,用于生成多组的长格式,r,dplyr,tidyr,R,Dplyr,Tidyr,我试图将此代码转换为函数: mtcars %>% group_by(gear) %>% select(hp, disp) %>% summarise_all(funs(n=sum(!is.na(.)), mean=mean(.,na.rm=T))) %>% gather(variable, value, -gear) %>% arrange(gear, sub('_.*', '', variable), sub('.*_', '', variable)) %&

我试图将此代码转换为函数:

mtcars %>% group_by(gear) %>% select(hp, disp) %>% 
summarise_all(funs(n=sum(!is.na(.)), mean=mean(.,na.rm=T))) %>% 
gather(variable, value, -gear) %>% 
arrange(gear, sub('_.*', '', variable), sub('.*_', '', variable)) %>%
separate(variable, into = c('var', 'metric'), '_')
它所做的是创建一个数据框架,我可以轻松地将其导入Excel并创建数据透视。我尝试了以下方法,但似乎不起作用:

mean_func <- function(vars,groups) {
  results <- test %>% group_by_at(vars(one_of(groups))) %>% 
    summarise_at(vars(starts_with(vars)), funs(n=sum(!is.na(.)), mean=mean(.,na.rm=T))) %>% 
    gather_(variable, value, -groups) %>% 
    arrange_(groups) %>%
    separate_(variable, into = c('var', 'metric'), '_'); View(results)
}
mean_func%
总结在(变量(以(变量)开始)、funs(n=sum(!is.na(.)、mean=mean(、na.rm=T)))%>%
聚集(变量,值,-组)%>%
排列(组)%>%
将_(变量,分为=c('var','metric'),'uu');查看(结果)
}

似乎问题出在
gather
语句的某个地方,但我不确定这里会出什么问题。有什么想法吗?

使用一点
tidy
cleanup来更改分组变量,并使用group_by_进行编程

library(tidyverse)

mean_func <- function(vars, groups) {
    groups = enquo(groups)

    vars %>% 
        group_by_(groups) %>% 
        dplyr::select(hp, disp) %>% 
        summarise_all(funs(n=sum(!is.na(.)), mean=mean(.,na.rm=T))) %>%
        gather(variable, value, -!!groups) %>%
        arrange(!!groups, sub('_.*', '', variable), sub('.*_', '', variable)) %>%
        separate(variable, into = c('var', 'metric'), '_')
}
mean_func(mtcars, gear)
库(tidyverse)
平均函数%
按组分组(组)%>%
dplyr::选择(hp,显示)%>%
总结所有(funs(n=总和(!is.na(.)),平均值=平均值(,na.rm=T))%>%
聚集(变量,值,-!!组)%>%
排列(!!组,子('...*','',变量),子('..'.'','',变量))%>%
分离(变量,分为=c('var','metric'),'uuu')
}
平均功能(平均车数、档位)

这似乎太落后了。为什么将数据导入R只是为了将其导出以生成数据透视表?不管是什么情况,使用dplyr/tidyr谓词编程都发生了变化。请参阅:因为用户受众想要数据透视表,所以他们可以轻松地操作和浏览数据。这不是我的决定,否则我会把一切都安排好。