2016-01-21 75 views
2

我不能與此(顯然)找出簡單地種操作:如何R中創建一個for循環這一特殊計算

給定這兩個diferent dataframes df(A)(nrow = 10,NcoI位= 3)和df(B)(nrow = 3,NcoI位= 3)

df(A)     df(B)    
col1 col2 col3  col1 col2 col3     
1  2  4   1 4  5 
3  5  7   2 7  7 
5  7  6   3 9  8 
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 

我想:

  • 乘法在DF(A)與那些的DF(B)的各列的每一個值相應的列
  • 並從每行開始總結三個連續結果。

讓我給你舉個例子:

A[1,1]*B[1,1] + A[2,1]*B[2,1] + A[3,1]*B[3,1]= 1*1+3*2+5*3= 22 # first expected result 
A[2,1]*B[1,1] + A[3,1]*B[2,1] + A[4,1]*B[3,1]= 3*1+5*2+6*3 = 31 # second expected result 
A[3,1]*B[1,1] + A[4,1]*B[2,1] + A[5,1]*B[3,1]= 5*1+6*2+9*3 = 44 # third expected result 
... 
A[8,1]*B[1,1] + A[9,1]*B[2,1] + A[10,1]*B[3,1]= 3.5*1+6*2+67*3 = 216.5 # last expected result 

等從直到最後可能三重df(A)每列的每個值開始。

我試着用這個for循環代碼:

temp <- rep(NA,3) 

my_matrix <- matrix(0,ncol=ncol(A),nrow=nrow(A)) 

for (i in 1:nrow(A)){ 
    for (j in 1:3){ 
    temp(j) <- A[i+j-1,]*B[i+j-1,] 
    } 
    my_matrix(i) <- sum(temp) 
} 

但[R回覆

Error in sum(temp) : invalid 'type' (list) of argument 

In addition: There were 3 warnings (use warnings() to see them) 

> warnings() 



1: In 1:dim(A) : numerical expression has 2 elements: only the first used 

2: In temp[j] <- A[i + (j - 1), ] * B[i + (j - 1), ] : 

    number of items to replace is not a multiple of replacement length 

預先感謝您 最佳

安娜

回答

1

作爲user164385的答案的替代方案,這非常好,您還可以使用下面的循環來完成這個任務(即使它們並不總是最優的,循環可以使它更容易從R開始)。請注意,對於全數字數據,您可以使用矩陣而不是數據框:

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 <- matrix(c(1,4,5,2,7,7,3,9,8), ncol=3, byrow=T) 

results <- matrix(nrow=8, ncol=3) 
for(i in 1:(nrow(A)-2)) { 
    results[i,] <- colSums(A[i:(i+2),] * B) 
} 
results 
     [,1] [,2] [,3] 
[1,] 22.0 106.0 117.0 
[2,] 31.0 150.0 124.2 
[3,] 44.0 190.0 135.3 
[4,] 37.5 162.5 148.7 
[5,] 81.0 142.8 204.1 
[6,] 57.0 113.9 182.7 
[7,] 46.0 132.9 118.0 
[8,] 216.5 111.3 53.0 
1

使用在R迴路很少是正確的選擇 - 涉及涉及操縱數據幀的任務,尤其是。 R提供了大量的向量化函數,可以用來完成大多數您可能想要使用循環的東西。儘管你起初看不到這一點(現代計算機上的小型數據集的性能優勢並不明顯),但學會用向量而不是循環來思考會長期幫助你獲得更多的使用空間該語言比通過始終使用循環嘗試用C語調說R語言。

例如:以實現自己的特定任務的一種方法是使用自定義功能和sapply砍東西一起:

A <- data.frame(1:10, 2:11, 3:12) 
B <- data.frame(1:3, 4:6, 7:9) 

f <- function(i) { 
    return(colSums(A[i:(i+2),] * B)) 
} 

C <- sapply(1:(nrow(A) - 2), f) 
t(C) 

輸出示例:

> A 
    X1.10 X2.11 X3.12 
1  1  2  3 
2  2  3  4 
3  3  4  5 
4  4  5  6 
5  5  6  7 
6  6  7  8 
7  7  8  9 
8  8  9 10 
9  9 10 11 
10 10 11 12 
> B 
    X1.3 X4.6 X7.9 
1 1 4 7 
2 2 5 8 
3 3 6 9 
> t(C) 
    X1.10 X2.11 X3.12 
[1,] 14 47 98 
[2,] 20 62 122 
[3,] 26 77 146 
[4,] 32 92 170 
[5,] 38 107 194 
[6,] 44 122 218 
[7,] 50 137 242 
[8,] 56 152 266 

如果你是新於R ,我絕對推薦閱讀整個apply功能家族 - 它們無窮無盡。