【问题标题】:iteratively multiply the values of a row in R迭代地将R中一行的值相乘
【发布时间】:2017-07-17 13:16:39
【问题描述】:

我正在尝试根据数据框中的一行中的观察结果计算一个新的值向量。我想从第一个值开始,将其乘以第二个值,然后将第三个值乘以我刚刚计算的值。我不确定如何引用一个在计算之前不存在的值。

如果我用手写的方式写出来,我会这样做:

index1 <- rnorm(12)
index2 <- rnorm(12)  
index3 <- rnorm(12)
index4 <- rnorm(12)
index5 <- rnorm(12)
data <- rbind(index1, index2, index3, index4, index5)

splice1=data[2,1]
splice2=splice1*data[2,2]
splice3=splice2*data[2,3]
splice4=splice3*data[2,4]
splice5=splice4*data[2,5]

splices <- c(splice1, splice2, splice3, splice4, splice5)

我需要为 25 行数据执行此操作。

我找到了这篇文章 Multiply previous row value by constant R 但是当您通过从数据集中进行索引进行引用时,我无法弄清楚如何使这项工作。

我确信一定有一种简单的方法可以做到这一点,但我不知道从哪里开始。

非常感谢您的帮助。

【问题讨论】:

    标签: r indexing apply


    【解决方案1】:

    ?apply?cumprod 函数对每一行数据进行处理:

    t(apply(data, 1, cumprod))
    
    #              [,1]        [,2]        [,3]       [,4]          [,5]
    #index1  0.37891415  1.02182094  0.62823228 0.03616281 -0.0262988311
    #index2 -0.06586518 -0.03332061 -0.02814185 0.01755643 -0.0238307051
    #index3 -0.09113830  0.13385726 -0.11245386 0.10917885 -0.1466176651
    #index4 -0.53727635  0.71947970  0.87007225 0.19779160 -0.2119473091
    #index5 -0.83982393 -0.08571211 -0.08986865 0.02597184 -0.0006549512
    

    这里的第 2 行看起来很熟悉:

    splices
    #     index2      index2      index2      index2      index2 
    #-0.06586518 -0.03332061 -0.02814185  0.01755643 -0.02383071 
    

    cumprod() 本质上只是将每个提供的数字集相乘,cumulative product:

    cumprod(1:5)
    #[1]   1   2   6  24 120
    

    如果速度是个问题,您可以查看matrixStats 包:

    library(matrixStats)
    rowCumprods(data)
    

    【讨论】:

    • 非常感谢。非常感谢。
    猜你喜欢
    • 2021-03-05
    • 2015-07-28
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多