А как насчет:
library(tidyverse)
library(zoo)
df %>%
group_by(country, year) %>%
mutate(
PercentageDifference = if_else(sector %in% c("ETS", "Regulated"), emissions, NA_real_),
PercentageDifference = na.locf(PercentageDifference, na.rm = FALSE),
PercentageDifference = if_else(sector == "ETS", round((PercentageDifference / lag(PercentageDifference)) * 100,1), NA_real_),
PercentageDifference = if_else(!is.na(PercentageDifference), paste0(PercentageDifference, "%"), NA_character_)
)
Первые 10 строк:
country year sector emissions iso2 PercentageDifference
<chr> <int> <chr> <dbl> <chr> <chr>
1 Austria 2011 Total 70115670 AT NA
2 Austria 2011 Regulated 42148360 AT NA
3 Austria 2011 Unregulated 27967320 AT NA
4 Austria 2011 ETS 30599420 AT 72.6%
5 Austria 2012 Total 67661400 AT NA
6 Austria 2012 Regulated 39494450 AT NA
7 Austria 2012 Unregulated 28166950 AT NA
8 Austria 2012 ETS 28387060 AT 71.9%
9 Austria 2013 Total 68001230 AT NA
10 Austria 2013 Regulated 38573960 AT NA
Важно знать, что столбец процентного значения будет иметь тип character
тогда, как вы указалихотел бы видеть %
, войдите в него.
Если вы хотите сохранить его numeric
, вы можете просто удалить последний шаг в mutate
, то есть вы можете сделать:
library(tidyverse)
library(zoo)
df %>%
group_by(country, year) %>%
mutate(
PercentageDifference = if_else(sector %in% c("ETS", "Regulated"), emissions, NA_real_),
PercentageDifference = na.locf(PercentageDifference, na.rm = FALSE),
PercentageDifference = if_else(sector == "ETS", round((PercentageDifference / lag(PercentageDifference)) * 100,1), NA_real_)
)
Вывод (первые 10 строк):
country year sector emissions iso2 PercentageDifference
<chr> <int> <chr> <dbl> <chr> <dbl>
1 Austria 2011 Total 70115670 AT NA
2 Austria 2011 Regulated 42148360 AT NA
3 Austria 2011 Unregulated 27967320 AT NA
4 Austria 2011 ETS 30599420 AT 72.6
5 Austria 2012 Total 67661400 AT NA
6 Austria 2012 Regulated 39494450 AT NA
7 Austria 2012 Unregulated 28166950 AT NA
8 Austria 2012 ETS 28387060 AT 71.9
9 Austria 2013 Total 68001230 AT NA
10 Austria 2013 Regulated 38573960 AT NA
Если вы не хотите загружать пакет zoo
, вы также можете использовать fill
из tidyverse
на отдельном шаге, но он на намного * на 1023 * медленнее.