【问题标题】:mutate_at - using a function with map2mutate_at - 使用带有 map2 的函数
【发布时间】:2017-06-21 20:13:26
【问题描述】:

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

分析数据:

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 行为不端。

【问题讨论】:

    标签: r purrr dplyr


    【解决方案1】:

    这是因为mutate_at 为每一列分别调用您的函数。它不会一次通过.中的所有列

    观察这个例子

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

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

    【讨论】:

    • 问题听起来像是您的数据不是“整洁”的。我可能会重塑,因此您没有多个收入列,然后进行标准联接以进行修改会更容易。
    • 不幸的是,我的数据是几场演出,当我“收集”收入然后加入每月外汇汇率,“变异”然后尝试“传播”时,机器内存不足。因此,上述策略。
    • 如果您确实想将 .x 和 .y 传递给 mutate(),我创建了一个实验函数 pairwise() 来执行此操作(其工作方式类似于 cross(),但接收 . x 和 .y 列)。可以通过这里的说明安装它:github.com/brshallo/pwiser
    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2019-11-04
    • 2017-01-05
    相关资源
    最近更新 更多