2012-02-17 56 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来完成同样的事情。