gpt4 book ai didi

r - 在使用变量调用的函数中实现 mutate

转载 作者:行者123 更新时间:2023-12-05 02:31:59 26 4
gpt4 key购买 nike

我想用不同的变量多次调用一个函数,每次都为数据框中的一个新变量设置一个值。这是我失败的尝试。感谢您的帮助!

dat <- tibble(score1 = runif(10), score2 = score1 * 2)

call_mutate_with_vars <- function(df, var1, var2, var3) {
df <-
df %>%
mutate({{var3}} := ifelse({{var1}} >= {{var2}},0,{{var2}} - {{var1}}))
df
}

call_mutate_with_vars(dat,"score1","score2","newscore")

我收到此错误:

Error: Problem with `mutate()` column `newscore`.
i `newscore = ifelse("score1" >= "score2", 0, "score2" - "score1")`.
x non-numeric argument to binary operator
Run `rlang::last_error()` to see where the error occurred.

最佳答案

拥抱运算符 {{ 用于作为符号传递的变量(即 fx(var),而不是 fx("var")).如果您需要将变量作为字符传递,您可以改用 .data 代词。

因此您可以将符号传递给当前函数:

library(dplyr)
set.seed(1)

call_mutate_with_vars <- function(df, var1, var2, var3) {
df %>%
mutate(
{{var3}} := ifelse(
{{var1}} >= {{var2}},
0,
{{var2}} - {{var1}}
)
)
}

call_mutate_with_vars(dat, score1, score2, newscore)

#> # A tibble: 10 x 3
#> score1 score2 newscore
#> <dbl> <dbl> <dbl>
#> 1 0.266 0.531 0.266
#> 2 0.372 0.744 0.372
#> 3 0.573 1.15 0.573
#> 4 0.908 1.82 0.908
#> 5 0.202 0.403 0.202
#> 6 0.898 1.80 0.898
#> 7 0.945 1.89 0.945
#> 8 0.661 1.32 0.661
#> 9 0.629 1.26 0.629
#> 10 0.0618 0.124 0.0618

或者重写处理字符的函数:

call_mutate_with_chr_vars <- function(df, var1, var2, var3) {
df %>%
mutate(
!!var3 := ifelse( # note use of !! unquote operator
.data[[var1]] >= .data[[var2]], # to use character as name
0,
.data[[var2]] - .data[[var1]]
)
)
}

call_mutate_with_chr_vars(dat, "score1", "score2", "newscore")

#> # A tibble: 10 x 3
#> score1 score2 newscore
#> <dbl> <dbl> <dbl>
#> 1 0.266 0.531 0.266
#> 2 0.372 0.744 0.372
#> 3 0.573 1.15 0.573
#> 4 0.908 1.82 0.908
#> 5 0.202 0.403 0.202
#> 6 0.898 1.80 0.898
#> 7 0.945 1.89 0.945
#> 8 0.661 1.32 0.661
#> 9 0.629 1.26 0.629
#> 10 0.0618 0.124 0.0618

reprex package 创建于 2022-03-07 (v2.0.1)

"Programming with dplyr" vignette 是解决这类问题的一个很好的引用。

关于r - 在使用变量调用的函数中实现 mutate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71384696/

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