简洁的评估:如何在依赖于%>%管道的自定义函数中使用dplyr :: na_if作为可选参数

艾曼

我正在尝试编写一个函数,该函数接受一个数据框,将列从转换chrdbl,然后将1加到列中。我也想可选替换为特定值NA否则,如果不使用相关的参数,我希望函数跳过NA替换步骤。

数据

library(tibble)
library(dplyr)
library(magrittr)

df <-
  tibble(id = 1:10, col_of_interest = 21:30) %>%
  add_row(id = 11, col_of_interest = 999) %>%
  mutate(across(col_of_interest, as.character))

df

## # A tibble: 11 x 2
##       id col_of_interest
##    <dbl> <chr>          
##  1     1 21             
##  2     2 22             
##  3     3 23             
##  4     4 24             
##  5     5 25             
##  6     6 26             
##  7     7 27             
##  8     8 28             
##  9     9 29             
## 10    10 30             
## 11    11 999  

编写函数

该功能应:

  1. 接收数据。
  2. col_of_interest转换chrdbl
  3. 替换999为NA 但仅当我指定999应替换为时NA
  4. 添加1col_of_interest

我的尝试

在编写函数时,有两个资源指导我:

  1. 将数据变量传递到函数参数中{{ var }},如此处所述
  2. 的使用if基于此答案
add_one <- function(data, var, na_if_val = NULL) {

  data %>%

    mutate(across({{ var  }}, as.numeric)) %>%
    
    {if( is.null( {{ na_if_val }} )
    ) .  # <--- the dot means: "return the preexisting dataframe"

      else

        na_if( {{ na_if_val }} )

    } %>%
    
    mutate(across({{ var  }}, add, 1))
}

当我在df对象上测试该功能时,会出现错误。

add_one(data = df,
        var = col_of_interest,
        na_if_val = "999")

Error in check_length(y, x, fmt_args("y"), glue("same as {fmt_args(~x)}")) : argument "y" is missing, with no default

谷歌搜索此错误产生了此页面,指出:

但是请注意,na_if()只能采用长度为1的参数。

但是,仅将其合并na_if( {{ na_if_val }} )add_one功能的管道中是可行的。是条件评估与之结合is.null,导致功能中断。我不明白为什么。

艾曼

我通过简单地指定x和的y参数解决了这个问题drop_na

add_one <- function(data, var, na_if_val = NULL) {

  data %>%

    mutate(across({{ var  }}, as.numeric)) %>%
    
    {if( is.null( {{ na_if_val }} )
    ) .  # <--- the dot means: "return the preexisting dataframe"

      else

        na_if(x = ., y = {{ na_if_val }} ) ## <-- change is here

    } %>%
    
    mutate(across({{ var  }}, add, 1))
}


add_one(data = df,
        var = col_of_interest,
        na_if_val = 999)

## # A tibble: 11 x 2
##       id col_of_interest
##    <dbl>           <dbl>
##  1     1              22
##  2     2              23
##  3     3              24
##  4     4              25
##  5     5              26
##  6     6              27
##  7     7              28
##  8     8              29
##  9     9              30
## 10    10              31
## 11    11              NA

编辑

按照@LionelHenry的评论删除{{ }}na_if_val

add_one <- function(data, var, na_if_val = NULL) {

  data %>%

    mutate(across({{ var  }}, as.numeric)) %>%

    {if( is.null(na_if_val)
    ) .  # <--- the dot means: "return the preexisting dataframe"

      else

        na_if(x = ., y = na_if_val)

    } %>%

    mutate(across({{ var  }}, add, 1))
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在scikit-learn中使用管道调整自定义内核函数的参数

在Keras中使用ImageDataGenerator时,如何定义依赖于输入的自定义成本函数?

如何定义依赖于模板参数的typedef的typedef

如何使数组的大小依赖于构造函数参数?

如何在mutate(dplyr)中使用自定义函数?

如何定义依赖于参数包转换的函数的返回类型?

在使用非标准评估的自定义dplyr函数中将字符串用作参数

如何在PostgreSQL表中使用自定义函数作为列的默认值

如何在自定义 R 函数中使用文本字符串作为变量

如何将System.Xml.XmlElement作为自定义Powershell函数的管道参数传递?

类型别名如何使用来指定依赖于模板参数的模板模板参数?

pytest我如何模拟依赖于其父调用参数的函数调用的副作用

如何让Typescript知道依赖于传入参数的函数的返回类型

如何有一个依赖于类的模板参数的成员函数实现?

使用依赖于lambda函数的类型作为返回类型

如何为依赖于Rust中泛型类型参数的结构的关联函数定义不同的实现?

Hyperopt:定义依赖于其他参数的参数

反应依赖于钩子的函数作为道具

依赖于泛型参数作为函数的值参数的类型

如何在pytorch中定义依赖于模型wrt输入的偏导数的损失函数?

如何在依赖于就地构建的 Python 项目中使用 Sphinx?

如何使闭包作为函数参数可选

如何在init函数中实例化一个依赖于self的对象?

如何在 Kotlin/Arrow 中调用依赖于多个类型类的多态函数

如何在依赖于视图模型的可组合函数中获得预览?

我如何仅使用依赖于我的选择选项参数的新API重绘Highchart?

MATLAB:如何将 fsolve 与多个输入一起使用,每个输入都依赖于多个参数?

如何在Scala中将依赖于路径的类型与类型类一起使用

如何使用自定义参数创建函数