【问题标题】:How to create a nested for loop in R for this (second) peculiar calculation如何在 R 中为这个(第二个)特殊计算创建一个嵌套的 for 循环
【发布时间】:2016-05-20 17:00:51
【问题描述】:

我已经升级了这个循环,(我以前的帖子)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), df(D) (nrow=6 ,ncol=1)

 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)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) 的前两列的每个值开始(直到最后一个可能的三元组),对于df(B)。依次将df(A)的col3和col4对df(C)的col3和col4求和为4个值,直到最后4个相加,像这样:

`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

df(A) 的 col3 和 col4 分别对应df(C) 的 col 3 和 4。

最后是df(D)df(A) 的col5,直到可以添加的最后6 个可能的值

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   

预期结果是一个包含 5 列的数据框,行数取决于 df B CD 的哪一列乘以 df(A) 的相应列。因此,预期的df 的行数可以等于df(A)col5df(C) 的最后一次操作,总共5 行。

我尝试了这个 for 循环代码:

for (i in 1:dim(A)[1]){              
  for (j in 1:dim(A)[2]){
    if(j <=2){
      results[i,j] <-colSums(A[i:(i+2),1:2]* B)
    }   

    if(j >=3 & j<=4){
      results[i,j] <- colSums(A[i:(i+3),3:4]* C)
    }

    if(j>4){
      results[i,j] <- colSums(A[i:(i+5),5]* D)
    }
  }
}

但 R 回复

Error in results[i, j] <- colSums(A[i:(i + 2), 1:2] * B) : 
  number of items to replace is not a multiple of replacement length

【问题讨论】:

    标签: r loops nested-loops


    【解决方案1】:

    导入您的数据(下次请简化):

    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
    

    【讨论】:

    • 抱歉,这不是预期的结果。我想要像上一篇文章那样的循环,但是改变行数,也许我很难解释这个问题。
    • 嗯,你没有显示预期的结果。据我了解你的问题,这就是你想要的,也许除了一些对你来说应该很容易的格式。
    • 对不起,预期的结果是正确的。你是对的!!问题是我的 TRUE df(A) 有 1356 行和 14 列。当我尝试将您的过滤器功能分别应用于 df B[1:12,1:7],C[1:24,1:4],D[1:36,1:2] 的 peridod 12,24,36 (而不是 3-4-6,它仅用于简化)预期结果仅适用于前 7 列(真实 df(B) 的列数)和所有剩余列的 NA。你知道为什么? (如果我解释得好)
    • Roland...我很抱歉,现在功能正常工作了..我的错!!非常感谢!!!万事如意
    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2015-07-29
    • 1970-01-01
    • 2020-05-11
    相关资源
    最近更新 更多