【问题标题】:How to store results in a matrix with a loop function in R如何在R中使用循环函数将结果存储在矩阵中
【发布时间】:2020-11-16 18:43:33
【问题描述】:

我一直在尝试使用循环创建向量或矩阵,但它只是使用最后一个循环的值创建一个变量。

我有一个 100x2 的 tableX 和一个 10x2 的 tableY。我需要将 table1 中的每一行乘以 table2 中的行并将结果存储在矩阵中。 (X[1,1]*Y[1,1]+X[1,2]*Y[1,2] 以此类推)

所以最后我需要一个包含乘法的 100x10 矩阵。

我设法为 tableY 的第一行创建了以下循环,因此它打印了我需要的结果表的第一个向量。

for (i in seq(1,100))) {
    results <- ((tableX[i,1]* tableY[1,1])+(tableX[i,2]* tableY[1,2]))
    print(results)
} 

我的问题是,如何将此打印输出存储为向量,然后对 tableY 的其他行执行相同操作?

提前谢谢你!

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一种方法:

    数据:

    x <- matrix(1:20, nrow = 10)
    y <- matrix(1:6, nrow = 3)
    

    代码:

    方法 1:(推荐)

    尺寸:

    • x = 10 乘 2

    • t(y) = 2 乘 3

    • x*t(y) = 10 乘 3

      # dot product of x and transpose of y
      x %*% t(y)
      
      #      [,1] [,2] [,3]
      # [1,]   45   57   69
      # [2,]   50   64   78
      # [3,]   55   71   87
      # [4,]   60   78   96
      # [5,]   65   85  105
      # [6,]   70   92  114
      # [7,]   75   99  123
      # [8,]   80  106  132
      # [9,]   85  113  141
      # [10,]   90  120  150
      

    方法 2

    y <- t(y)
    apply(x, 1, function(m) colSums(m*y))
    #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    # [1,]   45   50   55   60   65   70   75   80   85    90
    # [2,]   57   64   71   78   85   92   99  106  113   120
    # [3,]   69   78   87   96  105  114  123  132  141   150
    

    转换为矢量:

    c(apply(x, 1, function(m) colSums(m*t(y))))   
    

    方法:3

    rowSums(matrix( c(apply(expand.grid(x[,1],y[,1]), 1, prod), 
                      apply(expand.grid(x[,2],y[,2]), 1, prod)), 
                    ncol = 2))
    
    # [1]  45  50  55  60  65  70  75  80  85  90  57  64  71  78  85  92
    # [17]  99 106 113 120  69  78  87  96 105 114 123 132 141 150
    

    【讨论】:

    • method-1:(推荐)似乎没有意义。 OP 有 2 个 10 列矩阵和另一个 10 列矩阵作为所需的输出。矩阵乘法产生 3 列乘积。
    • @SteveM OP 没有发布任何数据。我创建了一个虚拟数据。它应该适用于我没有的 OP 数据。如果是格式问题,可以轻松解决,但我认为问题不在于矩阵乘法的不一致,而是在R中如何做到这一点。OP正在尝试for循环,但是R提供了处理矩阵运算的函数以高效的方式。
    • @SteveM 如果你想要矢量输出,请执行c(output) 或 c(t(output))
    • @Satish,我知道我在哪里误解了要求对,他想要一个 100 x 10 的输出。所以你的尺寸看起来是正确的。我会删除我的答案。
    【解决方案2】:

    这是base Router 的另一个选项

    c(Reduce(`+`, Map(function(u, v) outer(u, v), asplit(x, 2), asplit(y, 2))))
    
    #[1]  45  50  55  60  65  70  75  80  85  90  
    #[11] 57  64  71  78  85  92  99 106 113 120  
    #[21] 69  78  87  96 105 114 123 132 141 150
    

    数据

    x <- matrix(1:20, nrow = 10)
    y <- matrix(1:6, nrow = 3)
    

    【讨论】:

      【解决方案3】:

      尝试事先使用空值设置结果矩阵,对其进行初始化,然后使用循环的索引来填充它。

      如果您的向量总是相同的长度,那么您可以将结果行更改为: 长度(向量)显然替换为您期望的列数。

      results[i,1:length(vector)] <- ((tableX[i,1]* tableY[1,1])+(tableX[i,2]* tableY[1,2]))
      

      我不确定这是否能回答您的全部问题,听起来您想遍历两个值。您有示例表来简化问题吗?

      【讨论】:

        【解决方案4】:

        您需要在作业左侧带有 [i] 索引的内容。一般结构是这样的,假设循环有 100 次迭代:

        # initialize an empty object (here a vector) to store results
        results <- rep(NA, 100)
        
        # loop and store results
        for (i in seq(100)) {
           <do some calcs>
           results[i] <- <value to save>
        }
        

        然后对象results 将具有循环每次迭代中保存的值。

        如果您每次通过循环存储超过 1 个值,您可以将结果保存在矩阵或列表中。对于列表,循环基本相同,可以将空列表对象初始化为:

        results <- vector(mode="list", length=100)
        

        【讨论】:

          猜你喜欢
          • 2015-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多