繁体   English   中英

如何在R中使用循环函数将结果存储在矩阵中

[英]How to store results in a matrix with a loop function in R

我一直在尝试创建一个带有循环的向量或矩阵,但相反,它只是创建了一个带有最后一个循环值的变量。

我有一个 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 的其他行执行相同操作?

先感谢您!

这是一种方法:

数据:

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

代码:

方法一:(推荐)

方面:

  • 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

方法二

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

这是另一种选择, outer base R

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)

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

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

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

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

您需要在作业的左侧带有 [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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM