2014-09-21 3 views
2

데이터 프레임 ddf의 모든 열의 조합에 대해 기능을 수행해야합니다. 나는 보통 다음과 같이 사용합니다 :R을 두 번 'for'루프를 피하는 방법

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

mapply을 사용하여 벡터화 된 버전의 함수로 outer을 사용할 수 있습니다.

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 패키지의 병렬 적용 작업 중 하나를 사용하여 병렬 처리합니다.

관련 문제