按函数替换多个“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