【发布时间】:2019-12-20 23:51:39
【问题描述】:
我有以下数据(一些组织、kpi 测量、一长串变量(我在示例中给出了两个)。
df <- tibble::tribble(
~ORG_NM, ~KPI_NM, ~NUMR_VAL, ~DENO_VAL,
"AAA", "xxx", 8, 10,
"AAA", "xxx", 10, 10,
"BBB", "xxx", 1, 7,
"CCC", "xxx", 9, 3,
"CCC", "yyy", 9, 4,
"DDD", "xxx", 1, 7,
"AAA", "yyy", 8, 3,
"BBB", "yyy", 6, 1
)
我想汇总每个变量并生成一个宽表,以便每个组织只有一条记录。到目前为止,我的方法是使用需要更改的重复代码, - 使用要汇总的变量名称和应处理该变量的函数来汇总部分, - 展开部分 - value = 更改新列的名称, - rename_at - 为所有带有值的展开列添加有意义的后缀,显示用于实现它们的函数。 最后,我需要更改 full_join 中数据框的名称以附加新列。
library(tidyverse)
df_numrtr <- df %>%
group_by(ORG_NM, KPI_NM) %>%
summarise(mean_NUM_VAL = mean(NUMR_VAL)) %>%
spread(key = c(KPI_NM), mean_NUM_VAL) %>%
ungroup() %>%
rename_at(vars(-ORG_NM), function(x) paste0(x, "_num_mean"))
df_denom <- df %>%
group_by(ORG_NM, KPI_NM) %>%
summarise(mean_DENOM_VAL = mean(DENO_VAL)) %>%
spread(key = c(KPI_NM), mean_DENOM_VAL) %>%
ungroup() %>%
rename_at(vars(-ORG_NM), function(x)
paste0(x, "_den_mean"))
df_final <-
df_numrtr %>%
full_join(df_denom) %>%
select(ORG_NM, sort(names(.)))
ORG_NM xxx_den_mean xxx_num_mean yyy_den_mean yyy_num_mean
<chr> <dbl> <dbl> <dbl> <dbl>
1 AAA 10 9 3 8
2 BBB 7 1 1 6
3 CCC 3 9 4 9
4 DDD 7 1 NA NA
我想摆脱重复的代码,并拥有一个函数,该函数将接受一个变量和一个函数的名称。我想要的伪代码函数看起来像
fnSummarize <- function(df, my_org_var, my_kpi_var, my_var, my_fun ){
df_output<-df %>%
group_by({{my_groupby_var}}) %>%
summarise(paste0({{my_var}},"_",{{my_fun}}) = my_fun({{my_var}})) %>%
spread(key = {{my_kpi_var}}, paste0(my_var, my_fun)) %>%
ungroup() %>%
rename_at(vars(-{{ my_org_var}}), function(x) paste0(x, {{myfun}}))
return(df_output)
}
如何正确地将列名和要在该过程中使用的函数(如均值、求和、中位数、标准差)注入到这样的函数中。
【问题讨论】:
标签: r dplyr tidyverse tidyr rlang