我正在使用dplyr
包和其他相关包(如tidyr
和tidyselect
)编写函数.在阅读了Programming with dplyr篇文章和多次试验和错误之后,我能够编写一个包含数据屏蔽/整齐 Select 和名称注入的函数来实现部分目标.
compute_ratio <- function(numerator = dcdata,
denominator = pgdata,
bygroup = c('STUDY', 'SITE'),
nbydp = n_dc_bydp_ym,
numsuffix = dc_byss,
denosuffix = pg_byss){
numerator %>%
dplyr::group_by(dplyr::pick({{ bygroup }})) %>%
dplyr::summarise("n_{{numsuffix}}" := sum({{ nbydp }}, na.rm = TRUE)) %>%
dplyr::ungroup() %>%
# Merge denominator data with numerator data
dplyr::full_join(denominator, by = {{ bygroup }}) %>%
dplyr::mutate("cum_n_{{denosuffix}}" := cumsum("n_{{numsuffix}}"),
"ratio_{{numsuffix}}" := dplyr::if_else("cum_n_{{denosuffix}}" == 0, NA,
round("n_{{numsuffix}}" / "cum_n_{{denosuffix}}", 3)))
}
目前的问题是在过go 的mutate()
年里.我不知道如何引用名称,这是同一函数前面几行中的名称注入.例如,"n_{{numsuffix}}"
是从summarise()
派生的数据变量.当我需要在最后mutate()
的后面引用这个数据变量时,它现在不在:=的LHS上,而是:=的RHS上.
如有任何建议或指导,我们不胜感激.如何在相同的用户定义函数中将前面的名称注入引用为稍后的数据变量?
我已经try 了.data[[]]
,拥抱了{{ }}
,!!enquo
.所有这些都以错误结尾.
分子数据示例-dcdata
structure(list(STUDY = c("A", "B", "A", "A", "A", "A", "A", "B",
"B", "A", "A", "A", "B", "A", "B", "A", "A", "B", "A", "B"),
SITE = c("0187", "086108", "4603", "4304", "8617", "3205",
"0713", "086124", "086048", "6140", "0186", "4407", "086344",
"4413", "061027", "4115", "3403", "086009", "8618", "086020"
), n_dc_bydp_ym = c(0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 1, 1,
0, 0, 0, 0, 0, 1, 2)), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame"))
样本分母数据--pgdata
structure(list(STUDY = c("A", "A", "A", "A", "A", "A", "A", "A",
"A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B"),
SITE = c("0186", "0187", "0713", "3205", "3403", "4115",
"4304", "4407", "4413", "4603", "6140", "8617", "8618", "061027",
"086009", "086020", "086048", "086108", "086124", "086344"
), n_pg_byss = c(2705L, 371L, 1495L, 404L, 1357L, 2089L,
456L, 886L, 830L, 5034L, 912L, 1739L, 1991L, 60L, 18L, 858L,
666L, 759L, 28L, 171L)), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame"))
测试
test_ratiofun <- compute_ratio(numerator = dcdata,
denominator = pgdata,
bygroup = c('STUDY', 'SITE'),
nbydp = n_dc_bydp_ym,
numsuffix = dc_byss,
denosuffix = pg_byss)