2016-04-18 2 views
-1

私はこのマトリックスを有する:この操作にどのようにfor-loopを使用するだけですか?

A <- matrix(c(1,2,4,3,5,7,5,7,6,6,9, 
       5.9,9,11,8,4.5,5.5,7.9, 
       21,6.7,13.6,3.5,5,6,6, 
       7.9,1,67,4,2), ncol=3, byrow=T) 

このベクター:

B <- c(2 ,3, 4) 

私はこの期待される結果になります。私はこのコードを試み

 X1 X2 X3 
[1,] 4.0 14.0 22.9 
[2,] 8.0 21.0 26.9 
[3,] 11.0 27.0 27.8 
[4,] 15.0 25.5 35.4 
[5,] 13.5 23.2 35.5 
[6,] 25.5 17.2 28.5 
[7,] 24.5 19.6 22.6 
[8,] 9.5 16.9 NA 
[9,] 73.0 NA NA 
[10,] NA NA NA 

# the operation under the eventually code is: 
col 1: 
    A[1,1]+A[2,1]=1+3=4 # first result for first column. 
    A[2,1]+A[3,1]=3+5=8 # second result for first column 
    . . . 
    A[9,1]+A[10,1]=6+67= 73 #last expected result for first column 

col 2 : 
      A[1,2]+A[2,2]+A[3,2]=2+5+7=14 # first result for second column. 
      A[2,2]+A[3,2]+A[4,2]=5+7+9=21 # second result for second column 
      . . . 
      A[8,2]+A[9,2]+A[10,2]=5+7.9+4=16.9 #last expected result for second column 
and so on for the third columns of matrix A accordingly to the values of vector B. 

を:

res <- data.frame(matrix(ncol=ncol(A),nrow=nrow(A))) 
res_tot <- data.frame(matrix(ncol=ncol(A),nrow=nrow(A))) 
for (j in 1:ncol(A)){ 
    for(t in 1:nrow(A)){ 
     res <- A[t+B[j],j] 
     res_tot[t,j] <- res 
    } 
    } 

インデックスが正しくありません。さて、可能であれば、forのループとインデックス(例えばi,j,kなど)を使用したコードだけが、mapply、rollSumなどの機能を持たずにパッケージから取得できます。 可能ですか?してください...

答えて

1

私はsapplyforループの組み合わせを実行します。もちろん、ネストされたsapply関数を使用することもできます。

res <- NULL 
for (j in 1:3){ 
tmp <- sapply(1:nrow(A), function(i) ifelse((i+j > nrow(A), NA, sum(A[i:(i+j), j]))) 
res <- cbind(res,tmp);colnames(res) <- NULL 
} 
res 
     [,1] [,2] [,3] 
[1,] 4.0 14.0 22.9 
[2,] 8.0 21.0 26.9 
[3,] 11.0 27.0 27.8 
[4,] 15.0 25.5 35.4 
[5,] 13.5 23.2 35.5 
[6,] 25.5 17.2 28.5 
[7,] 24.5 19.6 22.6 
[8,] 9.5 16.9 NA 
[9,] 73.0 NA NA 
[10,] NA NA NA 

編集:sapplyなしとベクトルBと、合計する行数を定義する:

B <- c(2, 3, 4) 
res <- NULL 
for (j in 1:3){ 
    for(i in 1:nrow(A)){ 
    if(i == 1) tmp2 <- NULL 
    tmp <- ifelse((i-1+B[j] >nrow(A)),NA, sum(A[i:(i-1+B[j]),j])) 
    tmp2 <- rbind(tmp2,tmp);rownames(tmp2) <- NULL 
    } 
    res <- cbind(res,tmp2);colnames(res) <- NULL 
} 
+0

しかしsapplyせず、唯一のforループ使用することは可能ですか? – Diego

+0

そして、Bの値が連続していないが、例えばランダムな場合は? – Diego

+0

例えば、私の実際の操作では、Bはこの値を持っています: – Diego