【问题标题】:R: How can I obtain returns by row in a matrix?R:如何在矩阵中按行获得回报?
【发布时间】:2020-11-25 12:34:52
【问题描述】:

首先我创建一个 5x4 矩阵,其中随机数从 1 到 10:

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 矩阵。

【问题讨论】:

  • 试试(A[, -1] - A[, -ncol(A)]) / A[, -ncol(A)]

标签: r matrix return row yield


【解决方案1】:

您可以使用应用于转置矩阵的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

【讨论】:

    【解决方案2】:
    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] &lt;- fn.Calc(A[ir, ic+1], A[ir, ic])) 是魔法发生的时候其中实际值计算并存储在 B

    这是一种非常基本的方法,无需调用任何包,可能还有许多其他方法可以解决这个问题,需要更少的代码。

    【讨论】:

    • B &lt;- fn.Calc(A[, -1], A[, -ncol(A)]) 来自 27 φ 9 的评论
    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多