2016-08-25 36 views
0

我有一個數據框,其中包含一個列,其中包含一個函數的名稱,我想將其應用於由分組定義的數據分區。下面是設置了一個簡單的例子:在magrittr中應用字符串名稱的函數引用

df <- data.frame(x = c(1,2,3,4)) 
df.with.method <- df %>% merge(y = data.frame(method = c("mean", "median"))) 

什麼,我想知道的是該方法適用於每個分區,就像這樣:

df.with.method %>% group_by(method) %>% 
    mutate(x.hat = eval(method)(x)) 

這不起作用,但是,回國一個Error: attempt to apply non-function錯誤。這不起作用或者:

df.with.method %>% group_by(method) %>% 
    mutate(x.hat = eval(parse(text = method))(x)) 

然而,這並不工作,這表明其基本思想是確定:

df.with.method %>% group_by(method) %>% 
    mutate(x.hat = eval(parse(text = "mean"))(x)) 
+1

'get(unique(method))(x)'假設你的方法是字符類。 – Psidom

+1

...假設你將它與'data.frame(method = c(「mean」,「median」),stringsAsFactors = FALSE)合併。目前它是一個「因素」,所以'get(unique(method))(x)'可能無法正常工作。 – r2evans

回答

0

您可以構建呼叫,並分別call()eval()評估。這不是很好,但它的工作原理,並確保爲df.with.method

df.with.method %>% group_by(method) %>% 
    mutate(x.hat = mapply(function(a, b) eval(call(a, b)), method, x)) 
0

請嘗試以下操作。請注意,我們使用data_frame而不是data.frame

library(dplyr) 

df <- data_frame(x = c(1,2,3,4)) 
df.with.method <- df %>% merge(y = data_frame(method = c("mean", "median"))) 

df.with.method %>% 
    group_by(method) %>% 
    summarize(x = match.fun(method[1])(x)) %>% 
    ungroup() 

summarize部分可交替地爲:

summarize(x = do.call(method[1], list(x))) 

df.with.method如果必須問題是如圖準確,即method是一個因素,然後用as.character(method)summarize語句來替換method

相關問題