我正在使用dplyr包和其他相关包(如tidyrtidyselect)编写函数.在阅读了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)

推荐答案

也许有一种不那么复杂的方法,但似乎能达到你想要的效果

library(tidyverse)
library(rlang)
library(glue)
myfunc <- function(x,numsuffix,denosuffix){
  
  n_text <- as.character(glue("n_{as_name(enquo(numsuffix))}"))
  
  group_by(x,
           Species) |>
    summarise("{n_text}":= sum(Petal.Length, na.rm = TRUE)) %>%
    dplyr::ungroup() |> 
    mutate(
   "cum_n_{{denosuffix}}" := cumsum(!!sym(n_text)))
}

myfunc(iris,whatever,also)
# A tibble: 3 × 3
  Species    n_whatever cum_n_also
  <fct>           <dbl>      <dbl>
1 setosa           73.1       73.1
2 versicolor      213        286. 
3 virginica       278.       564. 
 

R相关问答推荐

从R中的另一个包扩展S3类的正确方法是什么

基于不同组的列的相关性

如何编辑ggplot的图例字使用自定义对象(gtable)?'

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

将数据集中的值增加到当前包含的最大值

IMF IFS数据以R表示

可以替代与NSE一起使用的‘any_of()’吗?

SHINY:使用JS函数应用的CSS样式显示HTML表格

如何将Which()函数用于管道%>;%

从多面条形图中删除可变部分

R:如果为NA,则根据条件,使用列名模式将缺少的值替换为另一列中的值

将具有坐标列表列的三角形转换为多个多边形

如何在反曲线图中更改X标签

删除字符串R中的重复项

如何构建一个for循环来循环处理动物ID?

如何显示准确的p值而不是<;0.001*?

如何在条形图中的x和填充变量中包含多个响应变量?

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

R:如何在数据集中使用Apply

在R中添加要打印的垂直线