[英]R: How can I obtain returns by row in a matrix?
首先,我创建一个随机数从 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 矩阵。
您可以使用应用于转置矩阵的Base R
函数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
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
只是你想要做的计算,我已经将它隔离在 function 中,以便在需要时更容易更改
然后创建一个新的 B 矩阵,其列比 A 少 1 列但行相同
最后我们要循环这个 B 矩阵中的每个元素,我喜欢用ir
代表增量行, ic
代表增量列,最后在循环内部( B[ir, ic] <- fn.Calc(A[ir, ic+1], A[ir, ic])
) 是魔法发生的时候,实际值被计算并存储在 B
这是一种非常基本的方法,无需调用任何 package,可能还有许多其他方法可以解决这个问题,需要更少的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.