2014-09-21 91 views
2

我必須對數據幀ddf的所有列的組合執行函數。我通常這樣做:如何避免這兩個'for'循環在R

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" 

如何避免在這種情況下使用'for'循環?我嘗試過,但一次只需要一列:

apply(ddf, 2, myfunction) 

感謝您的幫助。

回答

2

您可以使用outer以及使用mapply的函數的矢量化版本。

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

agstudy的選擇是偉大的。另一種選擇是預先生成的迭代地圖,然後使用適用於這樣的:

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

這可能是值得走下去只有當你有一個嚴重的大量列和多核心繫統這條路線。然後,您將使用parallel軟件包中的一個並行應用操作將其並行化。