【问题标题】:Running delta - Lag difference over row of data frame运行 delta - 数据帧行的滞后差异
【发布时间】:2020-11-09 12:57:35
【问题描述】:

我有一个数据框,例如

df1 <- data.frame(Company = c('A','B','C','D','E'),
                  `X1980` = c(1, 5, 3, 8, 13),
                  `X1981` = c(20, 13, 23, 11, 29),
                  `X1982` = c(33, 32, 31, 41, 42),
                  `X1983` = c(45, 47, 53, 58, 55))

我想创建一个新的数据框 (df2),以保持公司列不变。 1980 年和 1983 年的值应使用当前值减去先前值来计算。所以基本上我想要一个导致滚动增量的数据框。

        Company  1980  1981  1982  1983
           A      NA    19    13    12
           B      NA    8     19    15
           C      NA    20    8     22
           D      NA    3     30    17
           E      NA    16    13    13

感谢您的帮助!如果我有什么办法可以改进这个问题,请告诉我。

【问题讨论】:

    标签: r lag rolling-computation delta


    【解决方案1】:

    您可以在将NA 添加到第一个值的每一行中找到差异。

    df1[-1] <- t(apply(df1[-1], 1, function(x) c(NA, diff(x))))
    df1
    
    #  Company X1980 X1981 X1982 X1983
    #1       A    NA    19    13    12
    #2       B    NA     8    19    15
    #3       C    NA    20     8    22
    #4       D    NA     3    30    17
    #5       E    NA    16    13    13
    

    您还可以使用tidyverse 函数。

    library(dplyr)
    library(tidyr)
    
    df1 %>%
      pivot_longer(cols = -Company) %>%
      group_by(Company) %>%
      mutate(value = value - lag(value)) %>%
      pivot_wider()
    

    【讨论】:

      【解决方案2】:

      我们可以从matrixStats使用rowDiffs

      library(matrixStats)
      df1[-1] <-  cbind(NA, rowDiffs(as.matrix(df1[-1])))
      

      -输出

      df1
      #  Company X1980 X1981 X1982 X1983
      #1       A    NA    19    13    12
      #2       B    NA     8    19    15
      #3       C    NA    20     8    22
      #4       D    NA     3    30    17
      #5       E    NA    16    13    13
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-18
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        • 1970-01-01
        • 2023-02-22
        相关资源
        最近更新 更多