我正在尝试使用 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] 删除。
我来说两句