首先,我用从1到10的随机数创建一个5x4矩阵:
A <- matrix(sample(1:10, 20, TRUE), 5, 4)
> A
[,1] [,2] [,3] [,4]
[1,] 1 5 6 6
[2,] 5 9 9 4
[3,] 10 6 1 8
[4,] 4 4 10 2
[5,] 10 9 7 5在接下来的步骤中,我希望获得各行的返回(对于第1行:(5-1)/1,(6-5)/5,(6-6)/6,以及其他行的相同过程)。因此,最终的矩阵应该是5x3矩阵。
发布于 2020-08-05 19:00:07
您可以使用应用于转置矩阵的Base R funtion diff():
代码:
# Data
set.seed(1)
A <- matrix(sample(1:10, 20, TRUE), 5, 4)
# [,1] [,2] [,3] [,4]
#[1,] 9 7 5 9
#[2,] 4 2 10 5
#[3,] 7 3 6 5
#[4,] 1 1 10 9
#[5,] 2 5 7 9
# transpose so we get per row and not column returns
t(diff(t(A))) / A[, -ncol(A)]
[,1] [,2] [,3]
[1,] -0.2222222 -0.2857143 0.8000000
[2,] -0.5000000 4.0000000 -0.5000000
[3,] -0.5714286 1.0000000 -0.1666667
[4,] 0.0000000 9.0000000 -0.1000000
[5,] 1.5000000 0.4000000 0.2857143发布于 2020-08-05 18:59:47
A <- matrix(sample(1:10, 20, TRUE), 5, 4)
fn.Calc <- function(a,b){(a-b)/a}
B <- matrix(NA, nrow(A), ncol(A)-1)
for (ir in 1:nrow(B)){
for (ic in 1:ncol(B)){
B[ir, ic] <- fn.Calc(A[ir, ic+1], A[ir, ic])
}
}注意:当使用随机函数时,欢迎提供种子;)
所以我们这里有:fn.Calc只是你想要做的计算,我把它隔离在一个函数中,以便在需要时更容易修改
然后创建一个新的B矩阵,该矩阵具有比A少1列但是相同的行
最后,我们将循环这个B矩阵中的每个元素,我喜欢使用ir代表增量行,使用ic代表增量列,最后在循环内部(B[ir, ic] <- fn.Calc(A[ir, ic+1], A[ir, ic]))是魔术发生的时候,实际值被计算并存储在B中
这是一种非常基本的方法,不需要调用任何包,可能还有许多其他方法可以解决这个问题,需要的代码更少。
https://stackoverflow.com/questions/63263389
复制相似问题