【问题标题】:R apply and get values from previous rowR应用并从前一行获取值
【发布时间】:2014-01-08 03:20:22
【问题描述】:

我想将前一行的值用于涉及当前行的计算。矩阵看起来像:

      A   B
[1,]  1   2
[2,]  2   3
[3,]  3   4 
[4,]  4   5
[5,]  5   6

我想做以下操作:(cell[i]/cell[i-1])-1,本质上是计算从当前行到上一行(不包括第一行)的百分比变化(-1 到 1)。

输出应如下所示:

         C      D
[1,]    NA     NA
[2,]   1.0    0.5
[3,]   0.5   0.33 
[4,]  0.33   0.25
[5,]  0.25   0.20

这可以使用 for 循环轻松完成,但我正在处理大型数据集,因此我想使用 apply(或其他内置函数)来提高性能和更简洁的代码。

到目前为止,我想出了:

test.perc <- sapply(test, function(x,y) x-x[y])

但它不起作用。

有什么想法吗?

谢谢。

【问题讨论】:

    标签: r matrix apply cells


    【解决方案1】:
    df/rbind(c(NA,NA), df[-nrow(df),]) - 1
    

    会起作用。

    【讨论】:

    • 一个NA 就足够了:df/rbind(NA,df[-nrow(df),])-1
    【解决方案2】:

    1) 划分

    ans1 <- DF[-1,] / DF[-nrow(DF),] - 1
    

    rbind(NA, ans1),如果将 NA 放在第一行很重要

    2) 差异

    ans2 <- exp(sapply(log(DF), diff)) - 1
    

    rbind(NA, ans2),如果将 NA 放在第一行很重要

    3) diff.zoo

    library(zoo)
    coredata(diff(as.zoo(DF), arithmetic = FALSE)) - 1
    

    如果在开头有 NA 很重要,那么像这样添加 na.pad=TRUE 参数:

    coredata(diff(as.zoo(DF), arithmetic = FALSE, na.pad = TRUE)) - 1
    

    【讨论】:

      【解决方案3】:

      或者,坚持原来的sapply 方法:

      sapply(dat, function(x) x/c(NA,head(x,-1)) - 1 )
      

      或@user3114046 的答案的变体:

      dat/rbind(NA,head(dat,-1))-1
      
      #             A         B
      #[1,]        NA        NA
      #[2,] 1.0000000 0.5000000
      #[3,] 0.5000000 0.3333333
      #[4,] 0.3333333 0.2500000
      #[5,] 0.2500000 0.2000000
      

      【讨论】:

        猜你喜欢
        • 2017-07-12
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        • 2017-12-13
        • 1970-01-01
        • 2022-07-22
        • 2017-09-12
        • 1970-01-01
        相关资源
        最近更新 更多