2017-02-16 8 views
0

, чтобы попытаться упростить это, чтобы было легче объяснить. Допустим, у вас есть функция:Передача нескольких аргументов функции, взятой из dataframe

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

и dataframe:

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.1, как date существует для одного из входов.

0

Звук, как вы просто хотите, чтобы отключить упрощение

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

Вы также можете векторизации ваша функция

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