繁体   English   中英

R:如何在矩阵中按行获得回报?

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

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