向量化一个采用数据帧的R函数

时间:2012-02-17 14:09:49

标签: r vectorization

如果函数将数据框作为其参数之一,是否可以对其进行矢量化?我有一个自定义函数,它具有以下参数:

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 group ..我希望能够定义许多这样的组,然后立即在所有这些组上运行a.function。我意识到我可能需要显着重构代码;没关系。谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:1)

首先想到的是简单地使用mapply。您有一个与a.function的每个参数相关联的列表:aListbList等。

这些列表的每个第i个元素集合都是对a.function的连续调用的参数。电话会看起来像:

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

我包含simplify = FALSE只是因为我不知道您希望输出看起来是什么样的。

如果功能性编程更像是你的一杯茶,你可以使用?Map完成同样的事情。