我正在尝试编写一个函数,它接受数据框的名称和要用dplyr汇总的列名,然后返回已汇总的数据框。我尝试了许多来自lazyeval包的interp()函数的排列组合,但我花费了太多时间来尝试让它工作。因此,我在这里编写了一个“静态”版本的所需函数:
summarize.df.static <- function(){
temp_df <- mtcars %>%
group_by(cyl) %>%
summarize(qsec = mean(qsec),
mpg=mean(mpg))
return(temp_df)
}
new_df <- summarize.df.static()
head(new_df)
这是我卡住了的动态版本开头:
summarize.df.dynamic <- function(df_in,sum_metric_in){
temp_df <- df_in %>%
group_by(cyl) %>%
summarize_(qsec = mean(qsec),
sum_metric_in=mean(sum_metric_in)) # some mix of interp()
return(temp_df)
}
new_df <- summarize.df.dynamic(mtcars,"mpg")
head(new_df)
请注意,本示例中的列名也应来自传递的参数(在此示例中为mpg)。 还要注意,qsec列是静态的,即无需传递。
以下是“docendo discimus”发布的正确答案:
summarize.df.dynamic<- function(df_in, sum_metric_in){
temp_df <- df_in %>%
group_by(cyl) %>%
summarize_(qsec = ~mean(qsec),
xyz = interp(~mean(var), var = as.name(sum_metric_in)))
names(temp_df)[names(temp_df) == "xyz"] <- sum_metric_in
return(temp_df)
}
new_df <- summarize.df.dynamic(mtcars,"mpg")
head(new_df)
# cyl qsec mpg
#1 4 19.13727 26.66364
#2 6 17.97714 19.74286
#3 8 16.77214 15.10000
new_df <- summarize.df.dynamic(mtcars,"disp")
head(new_df)
# cyl qsec disp
#1 4 19.13727 105.1364
#2 6 17.97714 183.3143
#3 8 16.77214 353.1000
.dots
参数,并使用setNames()
为列表命名。有点麻烦 :/ - hadley