带有 dplyr 函数的自定义函数不接受参数值

用户126082

我正在尝试使用 dplyr从另一个相应的数字列 ( ) 中mutate_at减去一个数字列的值 ( A1) A2,我有多个列和几个数据框,我想为 (BCDE..., df1:df99) 执行此操作,所以我想写一个函数。

df1 <- df1 %>% mutate_at(.vars = vars(A1), .funs = funs(remainder = .-A2))

工作正常,但是当我尝试编写一个函数来执行此操作时:

REMAINDER <- function(df, numer, denom){ df <- df %>% mutate_at(.vars = vars(numer), .funs = funs(remainder = .-denom)) return(df) }

带参数 df1 <- REMAINDER(df1, A1, A2)

我收到错误 Error in mutate_impl(.data, dots) : Evaluation error: non-numeric argument to binary operator.

我不明白,因为我只是手动调用了没有函数的代码行,而我的列是数字。

乌韦

使用 dplyr 编程的小插图非常详细地解释了要做什么:

library(dplyr)
REMAINDER <- function(df, numer, denom) {
  numer <- enquo(numer)
  denom <- enquo(denom)
  df %>% mutate_at(.vars = vars(!! numer), .funs = funs(remainder = . - !! denom))
}

df1 <- data_frame(A1 = 11:13, A2 = 3:1, B1 = 21:23, B2 = 8:6)

REMAINDER(df1, A1, A2)
# A tibble: 3 x 5
     A1    A2    B1    B2 remainder
  <int> <int> <int> <int>     <int>
1    11     3    21     8         8
2    12     2    22     7        10
3    13     1    23     6        12
REMAINDER(df1, B1, B2)
# A tibble: 3 x 5
     A1    A2    B1    B2 remainder
  <int> <int> <int> <int>     <int>
1    11     3    21     8        13
2    12     2    22     7        15
3    13     1    23     6        17

命名结果列

OP 想要更新df1,他也想将此操作应用于其他列。

不幸的是,REMAINDER()当前定义函数将覆盖结果列:

df1
# A tibble: 3 x 4
     A1    A2    B1    B2
  <int> <int> <int> <int>
1    11     3    21     8
2    12     2    22     7
3    13     1    23     6
df1 <- REMAINDER(df1, A1, A2)
df1
# A tibble: 3 x 5
     A1    A2    B1    B2 remainder
  <int> <int> <int> <int>     <int>
1    11     3    21     8         8
2    12     2    22     7        10
3    13     1    23     6        12
df1 <- REMAINDER(df1, B1, B2)
df1
# A tibble: 3 x 5
     A1    A2    B1    B2 remainder
  <int> <int> <int> <int>     <int>
1    11     3    21     8        13
2    12     2    22     7        15
3    13     1    23     6        17

可以修改该函数,以便单独命名结果列:

REMAINDER <- function(df, numer, denom) {
  numer <- enquo(numer)
  denom <- enquo(denom)
  result_name <- paste0("remainder_", quo_name(numer), "_", quo_name(denom))
  df %>% mutate_at(.vars = vars(!! numer),
                   .funs = funs(!! result_name := . - !! denom))
}

现在,REMAINDER()在不同的列上调用两次并df1在每次调用后替换,我们得到

df1 <- REMAINDER(df1, A1, A2)
df1 <- REMAINDER(df1, B1, B2)
df1
# A tibble: 3 x 6
     A1    A2    B1    B2 remainder_A1_A2 remainder_B1_B2
  <int> <int> <int> <int>           <int>           <int>
1    11     3    21     8               8              13
2    12     2    22     7              10              15
3    13     1    23     6              12              17

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有 dplyr 的 R 中的自定义函数

dplyr的每列突变分别带有几个参数的自定义函数

将带有条件的自定义函数传递给 dplyr::mutate

带有 dplyr 动词的函数中的 if 语句

使用带有 ggplot2、dplyr 和 forcats 的自定义函数绘制降频条形图

带有dplyr的自定义函数会针对某个因素内的不同级别进行突变或汇总?

使用multidplyr在dplyr :: do中调用带有参数的函数

带有参数的jQuery自定义函数

从带有参数的自定义文件中调用函数

在keras回调中使用带有自定义参数的自定义函数

dplyr中带有条件的递归函数

带有 dplyr 和 ggplot2 的函数中的 Tidyeval

带有两个变量的 dplyr 函数

dplyr mutate应用自定义函数

R:循环自定义dplyr函数

创建带有传递给dplyr :: filter的参数的函数,解决nse的最佳方法是什么?

C ++术语的计算结果不接受带有0个参数的线程套接字的函数

在Pandas滚动时使用带有参数的自定义函数

如何在带有命名参数的Scala中创建自定义函数类型?

重复代码的分离——common.h文件——带有自定义参数的函数声明

使用 purrr 使用带有 2 个或更多参数的自定义函数进行映射

如何在Android自定义数据绑定中传递带有参数的函数

带有参数的自定义 Groovy 函数在 Jenkins 管道中不起作用

FakeItEasy伪造带有自定义属性且构造函数中带有参数的抽象类抛出ArgumentException

带有自定义函数的 Spark 聚合行

带有mutate的自定义函数不起作用

带有公式的函数的正确 dplyr 函数式编程语法是什么

带有 seq() 的 R dplyr

带有 dplyr 包的 for 循环