【问题标题】:Growth Rates in R with dplyr not working, NAs generated - Help neededR 中的增长率与 dplyr 不起作用,生成了 NA - 需要帮助
【发布时间】:2021-09-28 23:10:51
【问题描述】:

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

通常,这对我有用。然而,这一次它正在生成 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)
  )

【问题讨论】:

    标签: r dplyr group-by lag


    【解决方案1】:

    我认为你不应该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
    

    【讨论】:

    • 感谢这工作!知道为什么会这样吗?
    • 当您按half 分组时,组中只有一行采用lag,其中所有值都会返回NA
    【解决方案2】:

    不要使用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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 2019-09-12
      • 2015-03-16
      • 1970-01-01
      相关资源
      最近更新 更多