如何避免这种双重因素。在R中循环

时间:2014-09-21 08:42:45

标签: r

我必须对数据帧ddf的所有列组合执行功能。我通常这样做:

myfunction <- function(col1, col2) {print(aov(col1~col2))}
ddf = data.frame(first=1:3, second=letters[1:3], third=LETTERS[1:3])

len = length(ddf)
for(i in 1:len) for(j in 1:len) myfunction(ddf[,i], ddf[,j])
[1] "1 1"
[1] "1 a"
[1] "1 A"
[1] "a 1"
[1] "a a"
[1] "a A"
[1] "A 1"
[1] "A a"
[1] "A A"

如何避免使用&#39;在这种情况下循环?我尝试过申请,但一次只需要一列:

apply(ddf, 2, myfunction)

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您可以使用outermapply与函数的矢量化版本一起使用。

id <- seq_along(colnames(ddf))
outer(id,id,function(x,y)mapply(myfunction,ddf[,x],ddf[,y]))

答案 1 :(得分:2)

agstudy的选择很棒。另一种选择是事先生成迭代图,然后使用apply:

iterate <- expand.grid(1:3,1:3)
X <- apply(iterate,1,function(x) myfunction(ddf[,x[1]],ddf[,x[2]]))

只有当您拥有大量的列和多核系统时,才可能值得沿着这条路线走下去。然后,您将使用parallel包中的一个并行应用操作来并行化它。