[英]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.