R 中 dplyr 的增长率不工作,生成 NA - 需要帮助

Growth Rates in R with dplyr not working, NAs generated - Help needed

我正在尝试使用 dplyr 和滞后函数为 R 中的各种产品生成每个财政年度的增长率。

通常,这对我有用。然而这次它生成了 NA。我不确定是什么问题。以下代码为所有增长率生成“NA”。希望有人能帮忙。

library(flexdashboard)
library(dplyr)
library(magrittr)
library(scales)
library(sqldf)
library(ggplot2)
library(lubridate)
library(knitr)
library(tidyr)
library(kableExtra)
library(ggrepel)
library(htmltools)
library(stringr)
library(readxl)

t <- c(3000,2000, 6000)
u <- c("FY18H1", "FY18H2", "FY19H1", "FY19H2", "FY20H1", "FY20H2")
x <- c(1,2,3,4,5)
y <- c("a","b","c","d","e")
z <- c("apples","oranges")
identifer <- sort(c(replicate(x,n =6)))
name <- sort(c(replicate(y,n=6)))
business <- sort(c(replicate(z,n=15)))
half <- c(replicate(u, n=5))
dollars <- c(replicate(t, n = 10))

df <- data.frame(identifer,name, business,half, dollars)

df <- df %>% group_by(
  identifer,
  name,
  business,
  half
) %>%
  mutate(
    YoY_GROWTH_DOLLARS = dollars - lag(dollars, 2),
    YoY_GROWTH_RATE = round(YoY_GROWTH_DOLLARS/lag(dollars,2),4)
  )

不使用 dplyr::mutate,而是使用 plyr::mutate

df %>% dplyr::group_by(
  identifer,
  name,
  business,
  half
) %>%
  plyr::mutate(
    YoY_GROWTH_DOLLARS = dollars - lag(dollars, 2),
    YoY_GROWTH_RATE = round(YoY_GROWTH_DOLLARS/lag(dollars,2),4)
  )

   identifer name  business half   dollars YoY_GROWTH_DOLLARS YoY_GROWTH_RATE
       <dbl> <chr> <chr>    <chr>    <dbl>              <dbl>           <dbl>
 1         1 a     apples   FY18H1    3000                 NA          NA    
 2         1 a     apples   FY18H2    2000                 NA          NA    
 3         1 a     apples   FY19H1    6000               3000           1    
 4         1 a     apples   FY19H2    3000               1000           0.5  
 5         1 a     apples   FY20H1    2000              -4000          -0.667
 6         1 a     apples   FY20H2    6000               3000           1    
 7         2 b     apples   FY18H1    3000               1000           0.5  
 8         2 b     apples   FY18H2    2000              -4000          -0.667
 9         2 b     apples   FY19H1    6000               3000           1    
10         2 b     apples   FY19H2    3000               1000           0.5 

我觉得你不应该group_byhalf。尝试-

library(dplyr)

df %>% group_by(
  identifer,
  name,
  business
) %>%
  mutate(
    YoY_GROWTH_DOLLARS = dollars - lag(dollars, 2),
    YoY_GROWTH_RATE = round(YoY_GROWTH_DOLLARS/lag(dollars,2),4)
  ) %>% ungroup

#   identifer name  business half   dollars YoY_GROWTH_DOLLARS YoY_GROWTH_RATE
#       <dbl> <chr> <chr>    <chr>    <dbl>              <dbl>           <dbl>
# 1         1 a     apples   FY18H1    3000                 NA          NA    
# 2         1 a     apples   FY18H2    2000                 NA          NA    
# 3         1 a     apples   FY19H1    6000               3000           1    
# 4         1 a     apples   FY19H2    3000               1000           0.5  
# 5         1 a     apples   FY20H1    2000              -4000          -0.667
# 6         1 a     apples   FY20H2    6000               3000           1    
# 7         2 b     apples   FY18H1    3000                 NA          NA    
# 8         2 b     apples   FY18H2    2000                 NA          NA    
# 9         2 b     apples   FY19H1    6000               3000           1    
#10         2 b     apples   FY19H2    3000               1000           0.5  
# … with 20 more rows