我尝试编写一个函数,该函数接受数据框的名称和使用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)
以下是动态版本I的开头:
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列是静态的,即不传入。
以下是&#34; docendo discimus&#34;:
发布的正确答案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
答案 0 :(得分:7)
对于具体示例(使用静态“qsec”等),您可以执行以下操作:
library(dplyr)
library(lazyeval)
summarize.df <- function(data, sum_metric_in){
data <- data %>%
group_by(cyl) %>%
summarize_(qsec = ~mean(qsec),
xyz = interp(~mean(var), var = as.name(sum_metric_in)))
names(data)[names(data) == "xyz"] <- sum_metric_in
data
}
summarize.df(mtcars, "mpg")
#Source: local data frame [3 x 3]
#
# cyl qsec mpg
#1 4 19.13727 26.66364
#2 6 17.97714 19.74286
#3 8 16.77214 15.10000
AFAIK你不能(还是?)向dplyr :: rename提供输入“sum_metric_in”,你通常会用它来重命名列,这就是为什么我在示例中做的不同。
答案 1 :(得分:4)
您可以使用paste
或~
来获取summarize_
理解的引用输入。
df_in %>%
group_by(cyl) %>%
summarize_(qsec = ~mean(qsec),
sum_metric_in=paste0('mean(', sum_metric_in, ')'))
答案 2 :(得分:1)
使用dplyr
的devel版本(很快将于2017年4月发布0.6.0
),我们也可以使用quosures
summarise.dfN <- function(df, expr) {
expr <- enquo(expr)
colN <- quo_name(expr)
df %>%
group_by(cyl) %>%
summarise(qsec = mean(qsec),
!!colN := mean(!!expr))
}
summarise.dfN(mtcars, mpg)
# A tibble: 3 × 3
# cyl qsec mpg
# <dbl> <dbl> <dbl>
#1 4 19.13727 26.66364
#2 6 17.97714 19.74286
#3 8 16.77214 15.10000
enquo
行为类似于substitute
,将输入值作为quosure
返回,而quo_name
将表达式转换为字符串,我们可以取消引用(!!
或UQ
}在group_by/summarise/mutate
等进行评估。
如上所述,我们也可以将分组变量作为参数传递
summarise.dfN2 <- function(df, expr, grpVar) {
expr <- enquo(expr)
grpVar <- enquo(grpVar)
colN <- quo_name(expr)
df %>%
group_by(!!grpVar) %>%
summarise(qsec = mean(qsec),
!!colN := mean(!!expr))
}
summarise.dfN2(mtcars, mpg, cyl)
# A tibble: 3 × 3
# cyl qsec mpg
# <dbl> <dbl> <dbl>
#1 4 19.13727 26.66364
#2 6 17.97714 19.74286
#3 8 16.77214 15.10000