Текущая разница в дельта-задержке по строке фрейма данных

#r #lag #rolling-computation #delta

#r #задержка #rolling-вычисление #дельта

Вопрос:

У меня есть фрейм данных, такой как

 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), сохранив столбец company как есть. Значения для 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
  

Спасибо за помощь! Если у меня есть какой-либо способ улучшить вопрос, просто дайте мне знать.

Ответ №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:

Мы можем использовать rowDiffs из matrixStats

 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