2014-10-07 6 views
2

2 개의 데이터 프레임이 있습니다. r에있는 루프에 중첩 됨

M

은 다음과 같습니다
 vec_a vec_b vec_c 
    A 0.0  0  0 
    B 0.5  0  0 
    C 0.5  1  1 

Rank

은 다음과 같습니다

rk_ini 
    0.3333333 
    0.3333333 
    0.3333333 
내가 Rank의 1 행의 값에 의해 M의 1 행에있는 각 값을 곱 추가하고 싶습니다

이 제품들은 함께. 그런 다음 행 2와 행 3에 대해 동일하게 수행하십시오.

그런 다음이 세 값을 벡터와 열로 연결하여 두 번째 데이터 프레임 Rank에 바인딩하고 싶습니다. 이것은 내가 방금 계산 한 새로운 값으로 반복되어야하며, 더 많은 값을 생성하여 Rank에 바인딩하고, 함수의 시작 부분에서 지정한 횟수만큼 반복합니다. 새로운 컬럼을 지속적으로 바인딩하여 순위를 지정하십시오.

 rk_ini  nextrank[i] nextrank[i] nextrank[i] nextrank[i] nextrank[i] 
    A 0.3333333  0  0.1666667 0.8333333   0   0 
    B 0.3333333  0  0.1666667 0.8333333   0   0 
    C 0.3333333  0  0.1666667 0.8333333   0   0 

결과 더 다음과 같아야합니다 :

 rk_ini  nextrank[i] nextrank[i] nextrank[i] nextrank[i] nextrank[i] 
    A 0.3333333  0   .... 
    B 0.3333333 0.1666667  .... 
    C 0.3333333 0.8333333  .... 

를 각 연속 행으로 새로운 열에서의 제품의 합계 인

## iterate t times to get rank 
for(i in 1:t) { 
    for (j in 1:(nrow(M))) { 
    nr1[j] <- sum((Rank[j, i] * M[j, 1]), 
        (Rank[j, i] * M[j, 2]), 
        (Rank[j, i] * M[j, 3])) 

    nextrank <- c(nextrank, nr1[j]) 
    } 
    Rank <- cbind(Rank, nextrank[i]) 
} 

마지막으로 여기 결과입니다 이전 열에 M의 해당 행에있는 각 값을 곱합니다.

나는 여러 가지를 시도했으며이 마지막으로 오류가 발생하지 않지만 찾고있는 결과를 생성하지 않습니다. 여기서 무슨 일이 일어나고 있는지 이해하는데 도움을 줄 수 있다면 큰 도움이 될 것입니다.

감사합니다.

답변

3

행렬 곱셈 및 %*%replicate를 이용한 벡터화 방법 :

M <- as.matrix(M) 
R <- as.matrix(R) 
mm <- replicate(5,R <<- M%*%R,simplify = TRUE) 

     [,1]  [,2]  [,3]  [,4]  [,5] 
[1,] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 
[2,] 0.1666666 0.0000000 0.0000000 0.0000000 0.0000000 
[3,] 0.8333332 0.9999999 0.9999999 0.9999999 0.9999999 

M 및 R 어디에;

M <- read.table(text=' 
vec_a vec_b vec_c 
A 0.0 0 0 
B 0.5 0 0 
C 0.5 1 1',header=TRUE) 
R <- read.table(text=' 
rk_ini 
0.3333333 
0.3333333 
0.3333333',header=TRUE) 
+0

'M'과 'R'의 행 방향 곱의 계산은 행렬 곱셈의 경우가 아닙니다. (즉,'rowSums (sweep (M, 1, R, '*'))'는'M % * % R'과 같지 않습니다). – jbaums

+0

(+1) 사과 - 질문을 잘못 읽었습니다. 좋은 접근. – jbaums

+0

이것은 내가하고 싶은 것처럼 보입니다. 행렬 곱셈 문제입니다. 이 기능을 사용할 수 있는지 몰랐습니다. – DR41

1

같이 코드를 수정

여기
for(i in 1:t) { 
      for (j in 1:(nrow(M))) { 
      nr1[j] <- sum((Rank[j, i] * M[j, 1]), (Rank[j, i] * M[j, 2]), (Rank[j, i] * M[j, 3])) 

      nextrank <- c(nextrank, nr1[j]) 
      } 

      Rank <- cbind(Rank, nextrank[i*(1:3)]) **key step** 
    }     

    Rank  
    } 
0

시도 :

> M 
    vec_a vec_b vec_c 
A 0.0  0  0 
B 0.5  0  0 
C 0.5  1  1 
> 
> rank 
     rank 
1 0.3333333 
2 0.3333333 
3 0.3333333 
> 
> for(i in 1:4){ 
+ M$rank = rank[,length(rank)] 
+ M$new = apply(M, 1, function(x) x[4]*sum(x[1],x[2],x[3])) 
+ rank[,length(rank)+1] = M$new 
+ } 

> M = M[c(1:3)] 
> M 
    vec_a vec_b vec_c 
A 0.0  0  0 
B 0.5  0  0 
C 0.5  1  1 

> print(rank) 
     rank  V2   V3   V4   V5 
1 0.3333333 0.0000000 0.00000000 0.00000000 0.00000000 
2 0.3333333 0.1666666 0.08333332 0.04166666 0.02083333 
3 0.3333333 0.8333333 2.08333313 5.20833281 13.02083203 
> 
0

나는 다음 포스트에있는 데이터를 참조 제대로 이해한다면, 당신은 제품의 첫 번째 요소의 합으로 새 Rank 벡터의 첫 번째 요소를 원하는 Rank의 요소와 행 A의 요소 (즉, sum(M[1, ] * R[1]))의 두 번째 요소, Rank의 두 번째 요소와 행 B (sum(M[2, ] * R[2]))의 요소의 합계가되는 두 번째 요소 등이 있습니다. 그런 다음 원래 Rank 벡터 대신 새로운 Rank 벡터를 사용하여이 계산을 반복하려고합니다.

그렇다면 @rnso가 제공하는 솔루션의 결과가 정확하다고 믿습니다.

i의 n 번째 조작이 Rank[i] * rowSums(M)[i]^n과 동일하다는 점을 이용하여 동일한 결과를 얻는 벡터화 된 접근 방식입니다.

M <- matrix(c(0, 0, 0, 
       0.5, 0, 0, 
       0.5, 1, 1), ncol=3, byrow=TRUE) 

R.init <- c(0.3333333, 0.3333333, 0.3333333) 

n <- 5 
t(mapply(function(m, r) r * m^(seq_len(n)), rowSums(M), R.init)) 

#   [,1]  [,2]  [,3]  [,4]  [,5] 
# [1,] 0.0000000 0.00000000 0.00000000 0.00000000 0.00000000 
# [2,] 0.1666666 0.08333332 0.04166666 0.02083333 0.01041667 
# [3,] 0.8333333 2.08333312 5.20833281 13.02083203 32.55208008 
관련 문제