按函数替换多个“summary”语句

按函数替换多个“summary”语句,r,function,tidyverse,summarize,R,Function,Tidyverse,Summarize,我现在重复了很多代码,因为我需要为不同的组汇总相同的列。如何通过只编写一次summary函数(始终相同)而逐个定义输出名称和groupby参数来有效地实现这一点 最起码的例子是: col1使用combn: 首先,您需要使用如下函数计算变量: library(tidyverse) res_func <- function(x, y){ df %>% group_by(!!as.symbol(x), !!as.symbol(y)) %>% summarize(sum

我现在重复了很多代码,因为我需要为不同的组汇总相同的列。如何通过只编写一次
summary
函数(始终相同)而逐个定义输出名称和
groupby
参数来有效地实现这一点

最起码的例子是:

col1使用combn:


首先,您需要使用如下函数计算变量:

library(tidyverse)
res_func <- function(x, y){
  df %>% 
  group_by(!!as.symbol(x), !!as.symbol(y)) %>% 
  summarize(sum1 = sum(col4, col5))
}
只需运行
res\u func2(“col1”、“col2”)

>结果\u col1 col2
#一个tibble:4x3
#分组:col1[2]
col1 col2 sum1
1英国社会10
2英国技术6
3美国社会保险公司8
4美国技术12

要在自己的函数中使用dplyr,可以使用tidy求值。这是因为dplyr对dplyr代码求值的方式,称为非标准求值,它封装了所有行为与普通R代码不同的东西。我建议阅读以下内容:


summariefunction在以下情况下,您也可以使用
purrr::partial

library(purrr)
summarize45 <- partial(summarize, sum1 = sum(col4, col5))

result1b <- df %>% 
  group_by(col1, col2) %>%
  summarize45()

identical(result1, result1b)
# [1] TRUE
库(purrr)
总计45%
总结45()
相同(结果1,结果1b)
#[1]是的
或者进一步推动:

gb_df <- partial(group_by, df)

result1c <- gb_df(col1, col2) %>% summarize45()

identical(result1, result1c)
# [1] TRUE

gb\u df的
ddply
函数比
groupby%>%summary更简洁。您可以将第一个重新编写为
ddply(df,((col1,col2),summary,sum1=sum(col5,col5))
。不会回答您的实际问题,但会减少您使用的行数。如果向函数传递一个参数,则看起来更简单
res_func%group_by(!!as.symbol(x))%%>%summary(sum1=sum(col4,col5))}
是否可以根据请求轻松地分配给新df的名称?是的,
paste(x,collapse=“”)
这种方法似乎最适合我。只有一个问题:我有数百种不同的校验表要求和、除法等。有没有办法不在
函数()部分键入/复制所有校验表?我的组组合数量要少得多(8)。我建议您看看重塑2软件包。通过这种方式,您可以以整齐的长格式重新构造数据集。例如:
reforme2::melt(df)
。然后考虑
split
函数,它将您的长df转换为较小df的列表。然后将
lappy
功能与
summarief功能结合使用。在多个列上聚合几乎总是一个“不太好”的想法。如果你喜欢我的解决方案,请接受我的回答:-)这真是太棒了@Moody_mudscapper。正是我所需要的,立即将代码减少到1/6,而我甚至还没有完成一半的工作。如果可以的话,我会给你+1以上。
res_func2 <- function(x, y){
  assign(paste0("result_", x, y),
         df %>% 
           group_by(!!as.symbol(x), !!as.symbol(y)) %>% 
           summarize(sum1 = sum(col4, col5)), 
         envir = parent.frame())
}
> result_col1col2
# A tibble: 4 x 3
# Groups:   col1 [2]
  col1  col2    sum1
  <fct> <fct>  <int>
1 UK    Social    10
2 UK    Tech       6
3 US    Social     8
4 US    Tech      12
summarizefunction <- function(data, ..., sumvar1, sumvar2) {

    groups <- enquos(...)
    sumvar1 <- enquo(sumvar1)
    sumvar2 <- enquo(sumvar2)

    result <- data %>%
        group_by(!!!groups) %>%
        summarise(sum1 = sum(!!sumvar1, !!sumvar2))
    return(result)
}

summarizefunction(df, col1, col2, sumvar1 = col4, sumvar2 = col5)
library(purrr)
summarize45 <- partial(summarize, sum1 = sum(col4, col5))

result1b <- df %>% 
  group_by(col1, col2) %>%
  summarize45()

identical(result1, result1b)
# [1] TRUE
gb_df <- partial(group_by, df)

result1c <- gb_df(col1, col2) %>% summarize45()

identical(result1, result1c)
# [1] TRUE