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_by
half
。尝试-
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
我正在尝试使用 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_by
half
。尝试-
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