mutate_at - 使用map2的函数

时间:2017-06-21 20:13:27

标签: r dplyr purrr mutate

我的目标是将每月收入列设置从澳元转换为美元。为实现这一目标,我需要对每个收入列应用不同的汇率。

分析数据:

pacman::p_load(lubridate, purrr, dplyr)

df1 <- data.frame(
        Date     = seq(dmy("01/01/2017"), by = "day", length.out = 3),

        Customer = "a",
        Product  =  "xxx",
        Revenue1  = c(10, 20, 30),
        Revenue2  = c(100, 200, 300))

df2 <- data.frame(Factor1 = c(10),
                  Factor2 = c(20))

df3 <- select(df1, Revenue1:Revenue2)

这是我的功能

fx_adjust <- function(x, y = df2){map2_df(x, y, ~ .x * .y)}

这两项工作:

fx_adjust(df3, df2)
mutate_at(df1, vars(contains("Revenue")), funs(. * 10))

但这不起作用:

mutate_at(df1, vars(contains("Revenue")), funs(fx_adjust(.)))

有人可以解释为什么mutate_at行为不端。

1 个答案:

答案 0 :(得分:1)

这是因为mutate_at会为每列分别调用您的函数。它不会在.

中一次性传递所有列

观察此示例

fx_dump<-function(...) print(list(...))
mutate_at(df1, vars(contains("Revenue")), funs(fx_dump(.)))

您会看到fx_dump被调用两次,每列一次。您无法使用mutate_at一次将多个参数传递给您的函数。