2017-02-16 15 views
0

將嘗試並簡化它,以便更容易解釋。比方說,你有一個函數:將多個參數傳遞給從數據框中取出的函數

testfun = function(jID,kID,d){ 
    g=paste0(jID,kID) 
    date = d 
    bb=data.frame(g,date) 
    return(bb) 
} 

和數據幀:

x=data.frame(jID = c("a","b"),kID=c("c","d"),date="20170206",stringsAsFactors = FALSE) 

我想每一行傳遞到功能輸入:

如此循環1:

testfun(x[1,1],x[1,2],x[1,3]) -> return(bb) 

第2週期:

testfun(x[2,1],x[2,2],x[2,3]) -> return(bb) 

我試過使用mapply(testfun, x[,1],x[,2],x[,3])但我回來了一個總結。

回答

0

這是一個使用dplyr的解決方案。 關鍵是按行分組,併爲每一行運行你的函數。 函數的輸出應該在新數據集中創建新列,並在您使用的值旁邊。

library(dplyr) 

testfun = function(jID,kID,d){ 
    g=paste0(jID,kID) 
    date = d 
    bb=data.frame(g,date) 
    return(bb) 
} 


x=data.frame(jID = c("a","b"),kID=c("c","d"),date="20170206",stringsAsFactors = FALSE) 


x %>% do(data.frame(.,          # keep row of your dataset 
        testfun(.$jID, .$kID, .$date)))  # run the function using the values of that row 

# jID kID  date g date.1 
# 1 a c 20170206 ac 20170206 
# 2 b d 20170206 bd 20170206 

注意,過程date中創建新列date.1存在你輸入一個。

0

聽上去像是你要關閉簡化

mapply(testfun, x[,1],x[,2],x[,3], SIMPLIFY=FALSE) 

您也可以向量化你的函數

vtestfun <- (Vectorize(testfun, SIMPLIFY=FALSE)) 
vtestfun(x[,1],x[,2],x[,3]) 
相關問題