2017-06-21 73 views
0

我的目標是一個可以將每月的收入列轉換從澳元爲美元。爲了達到這個目標,我需要爲每個收入列應用不同的匯率。分析mutate_at - 使用功能與MAP2

數據:

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

這是因爲mutate_at單獨調用你的函數爲每列。它不通過所有列在.

一次觀察這個例子

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

你會看到,fx_dump叫了兩次,一次爲每個列。在同一時間使用mutate_at你不能將多個參數傳遞給你的函數。

+0

感謝您的....我如何能解決我的問題有什麼建議? – cephalopod

+0

問題聽起來像你的數據不「整潔」。我可能會重新塑形,因此您沒有多個收入列,那麼執行標準連接進行修改會更容易。 – MrFlick

+0

不幸的是,我的數據是一些演出,當我「收集」收入再加入月度外匯匯率,「變異」,然後嘗試以「傳播」,機器內存用完。因此,上述策略。 – cephalopod