2014-12-19 11 views
0

테이블에 두 개의 데이터 집합이 저장되어 있습니다. 하나는 [a, b] 집합이고 다른 하나는 [x, Sx, y, Sy, rho] 집합입니다. 나는 (a, b, x, Sx, y, Sy, rho)이 필요한 확률 함수 f을 가지고 있습니다. 결국 나는 첫 번째 [a, b]에 대한 모든 [x, Sx, y, Sy, rho]에 대한 확률 결과의 합을 찾고 싶습니다. 그런 다음 두 번째 [a, b] 이상 모든 [x, Sx, y, Sy, rho]의 합, 등등 ... 나는 [x, Sx, y, Sy, rho] 파일에 몇 백 행과 [a, b] 파일에 천 몇 백 행을하고 싶은다중 변수가있는 다중 루프가 발생하지 않도록하는 방법 R

을 찾을 수 있습니다.

두 개의 루프를 사용하지 않고이 작업을 수행 할 방법이 있는지 궁금합니다. 나는 다음과 같은 것을 시도해 보았고, 내가 원하는 방식대로 작동하지 않지만, 너무 느리다는 것을 안다.

도움이 될지 모르겠지만 코드에 함수를 추가했습니다. 죄송합니다. 함수 자체가 엉망이며 제대로 포맷되지 않았습니다.

# data file with (a, b) 
data   <- matrix(c(1, 0, 1, 1, 0.5, 0), nrow=3, ncol=2) 
colnames(data) <- c("a", "b") 
Ndat   <- dim(data) 
Ndata   <- Ndat[1] 

# data2 file with (x, Sx, y, Sy, rho) 
data2   <- matrix(c(1, 0.1, 1, 0.1, 0.002, 2, 0.1, 2, 0.1, 0.000001, 
          2, 0.1, 1, 0.1, 0.002), nrow=3, ncol=5) 
colnames(data2) <- c("x", "Sx", "y", "Sy", "rho") 
Ndat2   <- dim(data) 
Ndata2   <- Ndat[1] 

# function requires variables (a, b, s, Sx, y, Sy, rho) 
Prob <- function(a, b, Xi, sX, Yi, sY, rho) {sqrt(1 + a^2) * (
    exp(-((b + a * Xi - Yi)^2/(
    2 * ((a^2 * sX^2) - 
     (2 * a * rho * sX * sY) + sY^2)))) * sqrt((
      1 - rho^2)/(
      a^2 * sX^2 - 2 * a * rho *sX *sY + sY^2))/(
       sqrt(2 * pi) * sqrt(1 - rho^2))) 
    } 

# Here is my weak attempt 
Table <- NULL 
Table <- for (j in 1:Ndata) { 
    sum (for (i in 1:Ndata2) { 
    Datatable[i] = Prob(data[j, a], data[j, b], data2[i, x], 
       data2[i, Sx], data2[i, y], data2[i, Sy], 
       data2[i, rho]) 
    }) 
} 

나는 apply 기능의 주위에 내 머리를 감싸는 매우 힘든 시간을 보내고 있어요 그리고 그들은/사용해야합니다 때. 나는 아마도 내가 충분한 정보를 추가하지 못했기 때문에 나를 도울 수있는 제안은 훌륭 할 것이다. 나는 R 프로그래밍뿐만 아니라 프로그래밍에도 익숙하지 않으므로 부적절한 어휘 나 서식을 용서해주십시오.

data에 숫자 또는 행을 정의하여 Ndata을 전역으로 정의하는 것이 더 좋은 방법 일 수 있습니다. 그러나 이것들이 처음 발견했습니다.

이 함수는 재귀 적이어서는 안되지만 필자가 작성한 것처럼 보입니다. 나는 R에 소개 자습서에 많은 시간을 보냈으며, 여전히 매우 어려운 시간을 어떻게 이해하고 있는가? apply 기능 모음이 가장 잘 구현되었다.

의 첫 번째 행에서 a, b을 사용하여 data2에있는 각 행에이 함수를 적용하고 싶습니다. 그런 다음 sum 모든 이들에 대한 확률. 그런 다음 반복 내가이 작업을 수행하는 쉬운 방법이 느낌이 data2

+0

재귀 프로그래밍의 일부 형식을 시도하고 있습니까? 당신의'f' 함수는 스스로를 호출하지만, 그것이 어떻게 작동하는지 명확하지 않습니다. – gung

답변

0

의 모든 행에 적용 a, b를 사용 data의 2 행의 확률을 모두 합산해야하지만,이 같은 아마 작동합니다.

f <- function(a,b,x,y,z) a+b+x+y+z 
f.new <- function(p1,p2) { 
    p1=as.list(p1); p2=as.list(p2) 
    f(p1$a,p1$b,p2$x,p2$y,p2$z) 
} 

data1 <- data.frame(a=1:10,b=11:20) 
data2 <- data.frame(x=1:5,y=21:25,z=31:35) 
indx <- expand.grid(indx2=seq(nrow(data2)),indx1=seq(nrow(data1))) 
result <- with(indx,f.new(data1[indx1,],data2[indx2,])) 
sums <- aggregate(result,by=list(rep(seq(nrow(data1)),each=nrow(data2))),sum) 

당신은, (a,b)의 세트와 (x, Sx, y, Sy, rho)의 설정은 다음 첫 번째 집합의 모든 인스턴스에 대해, 두 번째 세트에 걸쳐 합계 변수 두 세트의 모든 조합에 대한 기능을 평가하려는 것 .

처음에는 두 세트를 나타내는 두 개의 인수를 취하기 위해 f(...) 함수를 다시 정의합니다. 이것은 f.new(...)입니다. 그런 식으로 원래 함수를 정의해야합니다. 더 빨리 실행됩니다.

그렇다면 우리는 우리가 indx를 사용 data1 및 인덱싱 data2를 사용 f.new(...) 전화, 데이터 프레임, data1data2 내의 행 번호의 모든 조합을 나타내는 두 개의 열이 indx를 생성한다. 이것은 (a,b)(x,y,z)의 모든 조합에서 평가 된 기능을 갖는 result을 산출했습니다.그런 다음이를 합하여 지정한 합계를 얻습니다.

이 방법은 메모리를 많이 사용합니다. result에는 ~ 10MM 요소가 있지만 루프보다 빠르게 실행됩니다.

+0

대단히 감사합니다. @jlhoward, 꽤 괜찮은 것 같아요. 그러나'f.new (...)'함수가'results'를 돌려 줄 수는 없습니다. 내 데이터가 깨끗하게 포맷되지 않는다는 문제가있을 수 있다고 생각합니다. 데이터가 저장된 테이블 내에 다른 변수가 있습니다. 새 함수에 열 제목을 사용하여 변수를 찾는 위치를 알려주는 방법이 있습니까? 여기서 작성한 데이터 세트에서 변수가 호출되는 위치와 방법을 이해하는 데 어려움을 겪고 있습니다. – Jesse