2012-02-17 54 views
1

如果函數將數據幀作爲其參數之一,是否可以對其進行矢量化?我有一個自定義函數,它採用下列參數:向量化需要數據幀的R函數

a.function<- function(a=c(), 
         b=data.frame(), 
         c=data.frame(), 
         d="", 
         e="", 
         f=data.frame()) { 
    ... 
} 

是否有一個數據結構,我可以用這將允許我使用的*apply功能之一,這樣我就可以同時對多個變量運行功能?


編輯:下面是一個例子,我目前如何運行代碼:

a <- c(1000,2000,1000) 
b <- data.frame(type=c('string1', 
         'string2', 
         'string3'), 
       value=c(2500,4000,3500), 
       difference=c(0,30,0)) 
c <- data.frame(pd=4, 
       gu=100) 
d <- 'string4' 
e <- 8 

test <- a.function(a, b, c, d, e) 
# test is a 1x3 character matrix 
> test 
[1] "44537" "0.1" "B" 

總之,abcde描述一個組,我跑a.function我希望能夠定義許多這樣的組,然後在所有這些組上同時運行a.function。我意識到我可能需要大量重構代碼;沒關係。謝謝!

+1

答案是肯定的。具體情況取決於你澄清你想要矢量化的東西。請發表一個例子,因爲目前沒有辦法回答這個問題。 – 2012-02-17 14:17:32

+0

@ gsk3 - 謝謝,我用一個通用示例更新了這篇文章。不幸的是,由於該模型是專有的,我可以發佈的內容有限。請讓我知道你是否需要更多細節。 – eykanal 2012-02-17 14:47:54

+1

@eykanal:我認爲@ gsk3希望看到的是你想要應用哪些數據框,所以用'sin'或'paste'替換專有函數。 – 2012-02-17 15:35:19

回答

2

怎麼樣的data.frames名單列表...

my.list <- list(list1=list(a,b,c,d,e),list2=list(a2,b2,c2,d2,e2)... etc.) 

那麼plyr家庭的功能在這裏我想看看。

llply(my.list,a.function) 

他們是方便他們容易並行化,但它越來越容易使用多個內核與應用家人太(例如mclapply(my.list,a.function,...))。你將不得不添加一些前置事項到你的函數來獲得各種data.frames

1

首先想到的是簡單地使用mapply。你必須與每個參數關聯到a.function列表:aListbList

第i這些列表元素的每個集合將參數連續調用a.function。呼叫看起來是這樣的:

mapply(a.function,aList,bList,cList,dList,eList,SIMPLIFY = FALSE) 

我包括simplify = FALSE只是因爲我不知道你想要什麼,輸出的樣子。

如果函數式編程更像是一杯茶,您可以使用?Map來完成同樣的事情。