在 r 中使用 NAs 在现有数据帧上滚动行和

Rolling rowsum over existing data frame with NAs in r

给定数据框:

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

我想创建一个新的数据框,其中每个值都替换为该行的当前值和先前值的总和。 NA 应保持原样。

这应该会产生以下数据框:

Company  1980  1981  1982  1983
   A      NA    NA    33    78
   B      5     17    NA    47
   C      3     NA    NA    53
   D      8     19    60    NA
   E      13    42    84    139

这是一个tidyverse方法

library(dplyr)
library(tidyr)
library(purrr)

df1 %>% 
  pivot_longer(matches("\d{4}$")) %>% 
  group_by(Company) %>% 
  mutate(value = accumulate(value, ~if (is.na(out <- .x + .y)) .y else out)) %>% 
  pivot_wider()

输出

# A tibble: 5 x 5
# Groups:   Company [5]
  Company X1980 X1981 X1982 X1983
  <chr>   <dbl> <dbl> <dbl> <dbl>
1 A          NA    NA    33    78
2 B           5    17    NA    47
3 C           3    NA    NA    53
4 D           8    19    60    NA
5 E          13    42    84   139