如何在R中为此(第二)特殊计算创建嵌套for循环

时间:2016-02-10 11:11:49

标签: r loops nested-loops

我对此循环进行了升级,(我之前的帖子)How to create a for loop in R for this peculiar calculation 但是,这次我想将循环应用于不同的列。 鉴于这些不同的数据帧df(A)(nrow = 10,ncol = 5),df(B)(nrow = 3,ncol = 2),df(C)(nrow = 4,ncol = 2),{ {1}}(nrow = 6,ncol = 1)

df(D)

我想:

  • df(A) df(B) df(C) df(D) col1 col2 col3 col4 col5 col1 col2 col3 col4 col5 1 2 4 4 2 1 4 5 4 5 3 5 7 2 1 2 7 7 5 6 5 7 6 6 3 3 9 8 7 1 6 9 5.9 8 6 8 9 4 9 11 8 4 9 8 4.5 5.5 7.9 6 7.3 10 21 6.7 13.6 8.7 2 3.5 5 6 6 6 6 7.9 1 9 7 67 4 2 2 6 中每列的值与相应列的df(A)df(B)df(C)相乘(请参阅{{1的列的名称) }})
  • 并且从每行开始连续三,四或六个结果。

让我举个例子:

df(D)

等从df的前两列(直到最后一个可能的三元组)的每个值开始,对于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[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)的col3和col4为col3,col4为df(B),为4值加总,直到最后4个加值,如下所示:

df(A)

等等df(C)的col3和col4分别为`A[1,3]*C[1,1]+A[2,3]*C[2,1]+A[3,3]*C[3,1]+A[4,3]*C[4,1]= 4*5+7*7+6*8+5.9*8= 164.2 first expected result A[2,3]*C[1,1]+A[3,3]*C[2,1]+A[4,3]*C[3,1]+A[5,3]*C[4,1]= second expected result A[7,3]*C[1,1]+A[8,3]*C[2,1]+A[9,3]*C[3,1]+A[10,3]*C[4,1]= last expected result 的第3列和第4列。

最后df(A)的{​​{1}}的col5,直到可以添加的最后6个可能的值

df(C)

预期结果是具有5列的数据框,并且取决于df(A)df(D)的哪一列的行数与A[1,5]*D[1,1]+A[2,5]*D[2,1]+A[3,5]*D[3,1]+A[4,5]*D[4,1]+A[5,5]*D[5,1]+A[6,5]*D[6,1]= 2*5+1*6+3*1+6*4+9*8+7.3*10= first result A[2,5]*D[1,1]+A[3,5]*D[2,1]+A[4,5]*D[3,1]+A[5,5]*D[4,1]+A[6,5]*D[5,1]+A[7,5]*D[6,1]= second result A[5,5]*D[1,1]+A[6,5]*D[2,1]+A[7,5]*D[3,1]+A[8,5]*D[4,1]+A[9,5]*D[5,1]+A[10,5]*D[6,1]= last expected result 的相应列相乘。因此,预期df B C的行数可以等于D的{​​{1}}的最后一次操作,总行数为5。

我试过这个for循环代码:

df(A)

但是R回复

df

1 个答案:

答案 0 :(得分:2)

导入您的数据(下次请更容易):

A <- read.table(text = "col1  col2  col3  col4   col5                 
1      2      4     4      2            
                3      5      7     2      1            
                5      7      6     6      3             
                6      9      5.9   8      6                        
                9      11     8     4      9                               
                4.5   5.5     7.9   6      7.3                                   
                21    6.7    13.6   8.7    2     
                3.5   5       6     6     6
                6     7.9     1     9     7
                67     4      2     2     6", header = TRUE)

B <- read.table(text = "col1 col2                 
1   4       
2   7         
3   9      ", header = TRUE)

C <- read.table(text = "ccol3 col4              
5   4   
7   5     
 8   7    
8   9 ", header = TRUE) 

D <- read.table(text = "col5                 
5
6
1
4
8
10", header = TRUE)

结合BCD

filters <- c(B, C, D)

使用filter

mapply( #loop over corresponding pairs
  stats::filter, #function for linear filter 
  A, #use first, second, ... column of A 
  lapply(filters, rev), #use first, second, ... filter, but reverse them first
  sides = 1 #filter not centered, but for past values
)
#       col1  col2  col3  col4  col5
# [1,]    NA    NA    NA    NA    NA
# [2,]    NA    NA    NA    NA    NA
# [3,]  22.0 106.0    NA    NA    NA
# [4,]  31.0 150.0 164.2 140.0    NA
# [5,]  44.0 190.0 188.2 130.0    NA
# [6,]  37.5 162.5 198.5 146.0 188.0
# [7,]  81.0 142.8 257.5 172.3 143.4
# [8,]  57.0 113.9 252.1 160.9 165.2
# [9,]  46.0 132.9 190.7 190.5 217.3
#[10,] 216.5 111.3 134.0 145.8 230.8