Создать цикл для расчета процента в условиях и заполнить результаты - PullRequest
0 голосов
/ 18 ноября 2018

Я пытался найти какую-то информацию, но не смог найти то, что искал.

Это мой фрейм данных full.data (отрывок)

country year      sector    emissions iso2 PercentageDifference
....
Austria 2011       Total 7.011567e+07   AT                    0
Austria 2011   Regulated 4.214836e+07   AT                    0
Austria 2011 Unregulated 2.796732e+07   AT                    0
Austria 2011         ETS 3.059942e+07   AT                    0
Austria 2012       Total 6.766140e+07   AT                    0
Austria 2012   Regulated 3.949445e+07   AT                    0
Austria 2012 Unregulated 2.816695e+07   AT                    0
Austria 2012         ETS 2.838706e+07   AT                    0
Austria 2013       Total 6.800123e+07   AT                    0
Austria 2013   Regulated 3.857396e+07   AT                    0
Austria 2013 Unregulated 2.942727e+07   AT                    0
Austria 2013         ETS 2.980441e+07   AT                    0
Austria 2014       Total 6.425333e+07   AT                    0
Austria 2014   Regulated 3.631107e+07   AT                    0
Austria 2014 Unregulated 2.794225e+07   AT                    0
Austria 2014         ETS 2.805597e+07   AT                    0
Austria 2015       Total 6.670398e+07   AT                    0
Austria 2015   Regulated 3.800309e+07   AT                    0
Austria 2015 Unregulated 2.870090e+07   AT                    0
Austria 2015         ETS 2.949206e+07   AT                    0
Austria 2016       Total 6.740209e+07   AT                    0
Austria 2016   Regulated 3.765177e+07   AT                    0
Austria 2016 Unregulated 2.975031e+07   AT                    0
Austria 2016         ETS 2.900012e+07   AT                    0
Austria 2017         ETS 3.055523e+07   AT                    0
Belgium 1990       Total 1.204844e+08   BE                    0
Belgium 1990   Regulated 7.861411e+07   BE                    0
Belgium 1990 Unregulated 4.187029e+07   BE                    0
Belgium 1991       Total 1.235447e+08   BE                    0
Belgium 1991   Regulated 7.981152e+07   BE                    0
Belgium 1991 Unregulated 4.373319e+07   BE                    0
Belgium 1992       Total 1.226578e+08   BE                    0
Belgium 1992   Regulated 7.828396e+07   BE                    0
Belgium 1992 Unregulated 4.437385e+07   BE                    0
Belgium 1993       Total 1.215573e+08   BE                    0
Belgium 1993   Regulated 7.675229e+07   BE                    0
Belgium 1993 Unregulated 4.480499e+07   BE                    0
Belgium 1994       Total 1.249382e+08   BE                    0
Belgium 1994   Regulated 8.064799e+07   BE                    0
Belgium 1994 Unregulated 4.429020e+07   BE                    0
....

Япытаясь заполнить full.data$PercentageDifference процент emissions, где sector=ETS и где sector=Regulated (сектор выбросов = ETS равен xx.y% сектора = регулируемый).Это процентное значение должно быть занесено в PercentageDifference, где sector=ETS.Это должно происходить на каждый год и страну.Я предполагаю, что мне понадобится петля здесь.Я читал, что dplyr полезен для этого, но на самом деле не понял, как это сделать.Однако, если есть лучший способ, чем dplyr, это нормально для меня.

Результат будет выглядеть следующим образом

country year      sector    emissions iso2 PercentageDifference
....
Austria 2011       Total 7.011567e+07   AT                    0
Austria 2011   Regulated 4.214836e+07   AT                    0
Austria 2011 Unregulated 2.796732e+07   AT                    0
Austria 2011         ETS 3.059942e+07   AT                72.6%
Austria 2012       Total 6.766140e+07   AT                    0
Austria 2012   Regulated 3.949445e+07   AT                    0
Austria 2012 Unregulated 2.816695e+07   AT                    0
Austria 2012         ETS 2.838706e+07   AT                71.9%
Austria 2013       Total 6.800123e+07   AT                    0
Austria 2013   Regulated 3.857396e+07   AT                    0
Austria 2013 Unregulated 2.942727e+07   AT                    0
Austria 2013         ETS 2.980441e+07   AT                77.3%
Austria 2014       Total 6.425333e+07   AT                    0
Austria 2014   Regulated 3.631107e+07   AT                    0
Austria 2014 Unregulated 2.794225e+07   AT                    0
Austria 2014         ETS 2.805597e+07   AT                77.3%

Я не опубликовал то, что я сделал до сих пор, так как яне удалось сделать много ....

Спасибо за помощь любого рода.

Nordsee

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

А как насчет:

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 * медленнее.

0 голосов
/ 18 ноября 2018

Вот решение, основанное на tydiverse / dplyr.

Файлы stack.txt содержат вставленный текст из приведенного выше примера.

library(tidyverse)
full_data <- read.table("stack.txt", quote="\"", comment.char="") 
names(full_data) <-  c("country", "year", "sector", "emission", "iso", "perc")

full_data <- full_data %>% 
  select(-perc)
full_data %>% 
  select(-iso) %>% 
  spread(sector, emission) %>% 
  mutate(percentage = ETS/Regulated) %>% 
  select(country, year, percentage) %>%
  right_join(full_data) %>%
  select(country, year, sector, emission, iso, percentage) %>% 
  mutate(percentage = ifelse(sector == "ETS", percentage, 0))

Результат:

   country year      sector  emission iso percentage
1  Austria 2011       Total  70115670  AT  0.0000000
2  Austria 2011   Regulated  42148360  AT  0.0000000
3  Austria 2011 Unregulated  27967320  AT  0.0000000
4  Austria 2011         ETS  30599420  AT  0.7259931
5  Austria 2012       Total  67661400  AT  0.0000000
6  Austria 2012   Regulated  39494450  AT  0.0000000
7  Austria 2012 Unregulated  28166950  AT  0.0000000
8  Austria 2012         ETS  28387060  AT  0.7187607
9  Austria 2013       Total  68001230  AT  0.0000000
10 Austria 2013   Regulated  38573960  AT  0.0000000
11 Austria 2013 Unregulated  29427270  AT  0.0000000

Если вам нужно больше объяснений, как это работает, я бы посоветовал разорвать конвейер и посмотреть промежуточные результаты, например

full_data %>% 
  select(-iso) %>% 
  spread(sector, emission) %>%
  mutate(percentage = ETS/Regulated)

   country year      ETS Regulated     Total Unregulated percentage
1  Austria 2011 30599420  42148360  70115670    27967320  0.7259931
2  Austria 2012 28387060  39494450  67661400    28166950  0.7187607
3  Austria 2013 29804410  38573960  68001230    29427270  0.7726562
4  Austria 2014 28055970  36311070  64253330    27942250  0.7726561
5  Austria 2015 29492060  38003090  66703980    28700900  0.7760437
6  Austria 2016 29000120  37651770  67402090    29750310  0.7702193

С уважением, Павел

...