gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:49:46 26 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数接受一个数据帧,从 chr 转换一列至 dbl ,然后将 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
编写函数
该功能应该:
  • 取数据。
  • 转换 col_of_interest来自 chrdbl .
  • 替换 999与 NA ( 但仅当我指定 999 应替换为 NA )
  • 添加 1col_of_interest

  • 我的尝试
    在编写我的函数时,我受到了两个资源的指导:
  • 使用 {{ var }} 将数据变量传递给函数参数如涵盖 here .
  • if的使用基于 this answer .

  • 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


    谷歌搜索这个错误产生 this page , 说明:

    Note, however, that na_if() can only take arguments of length one.


    但是,仅包含 na_if( {{ na_if_val }} )add_one函数的管道确实有效。这是条件评估结合 is.null这会导致功能中断。我不明白为什么。

    最佳答案

    你有几个问题,但主要的一个是因为你做的非标准评估是错误的。

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

    var_b <- enquo(var)

    data <- data %>%
    mutate(across(!!var_b, as.numeric))

    if(!is.null(na_if_val)){
    data <- data %>%
    mutate(across(!!var_b, na_if, y = na_if_val))
    }

    data <- data %>%
    mutate(across(!!var_b, add, 1))

    return(data)
    }
    返回:
    add_one(df, col_of_interest, 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
    首先,您需要用 enquo() 引用感兴趣的变量函数,然后,你在你想要的地方取消引用这个变量(用 bang bang !! )。您的函数的另一个问题是在管道中间插入 if 语句,这不起作用。如果需要在特殊情况下应用某些方法,则需要与主计算分开进行评估。

    关于r - 整洁评估:如何在依赖 %>% 管道的自定义函数中使用 dplyr::na_if 作为可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64153961/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com