Как да изчислим средните темпове на растеж за 5 години на група променливи в панелен набор от данни в R

Искам да изчисля 5-годишен среден темп на растеж на някои променливи в моята база данни, групирани по кода на променливата. Това означава, че през първите 4 години от всяка променлива трябва да имам NA. базата данни може да бъде изтеглена тук

    pwt<-structure(list(code = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("ABW", 
"AFG", "AGO", "AIA", "ALB", "AND", "ANT", "ARE", "ARG", "ARM", 
"ATG", "AUS", "AUT", "AZE", "BDI", "BEL", "BEN", "BFA", "BGD", 
"BGR", "BHR", "BHS", "BIH", "BLR", "BLZ", "BMU", "BOL", "BRA", 
"BRB", "BRN", "BTN", "BWA", "CAF", "CAN", "CH2", "CHE", "CHL", 
"CHN", "CIV", "CMR", "COD", "COG", "COK", "COL", "COM", "CPV", 
"CRI", "CSK", "CUB", "CUW", "CYM", "CYP", "CZE", "DEU", "DJI", 
"DMA", "DNK", "DOM", "DZA", "ECU", "EGY", "ERI", "ESP", "EST", 
"ETH", "FIN", "FJI", "FRA", "FSM", "GAB", "GBR", "GEO", "GHA", 
"GIN", "GMB", "GNB", "GNQ", "GRC", "GRD", "GRL", "GTM", "GUY", 
"HKG", "HND", "HRV", "HTI", "HUN", "IDN", "IND", "IRL", "IRN", 
"IRQ", "ISL", "ISR", "ITA", "JAM", "JOR", "JPN", "KAZ", "KEN", 
"KGZ", "KHM", "KIR", "KNA", "KOR", "KWT", "LAO", "LBN", "LBR", 
"LBY", "LCA", "LIE", "LKA", "LSO", "LTU", "LUX", "LVA", "MAC", 
"MAR", "MCO", "MDA", "MDG", "MDV", "MEX", "MHL", "MKD", "MLI", 
"MLT", "MMR", "MNE", "MNG", "MOZ", "MRT", "MSR", "MUS", "MWI", 
"MYS", "NAM", "NCL", "NER", "NGA", "NIC", "NLD", "NOR", "NPL", 
"NRU", "NZL", "OMN", "PAK", "PAN", "PER", "PHL", "PLW", "PNG", 
"POL", "PRI", "PRK", "PRT", "PRY", "PSE", "PYF", "QAT", "RKS", 
"ROU", "RUS", "RWA", "SAU", "SDN", "SEN", "SGP", "SLB", "SLE", 
"SLV", "SMR", "SOM", "SRB", "STP", "SUN", "SUR", "SVK", "SVN", 
"SWE", "SWZ", "SXM", "SYC", "SYR", "TCA", "TCD", "TGO", "THA", 
"TJK", "TKM", "TLS", "TON", "TTO", "TUN", "TUR", "TUV", "TWN", 
"TZA", "UGA", "UKR", "URY", "USA", "UZB", "VCT", "VEN", "VGB", 
"VNM", "VUT", "WSM", "YEM", "YUG", "ZAF", "ZMB", "ZWE"), class = "factor"), 
    year = c(2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 
    2007L, 2008L, 2009L, 2010L, 2000L, 2001L, 2002L, 2003L, 2004L, 
    2005L, 2006L, 2007L, 2008L, 2009L, 2010L), pop = c(0.090852998197079, 
    0.092897996306419, 0.094991996884346, 0.097016997635365, 
    0.098737001419067, 0.10003100335598, 0.100832000374794, 0.101219996809959, 
    0.101352997124195, 0.101452998816967, 0.101668998599052, 
    16.4409236907959, 16.9832668304443, 17.5726490020752, 18.203369140625, 
    18.8657169342041, 19.5525417327881, 20.2623996734619, 20.9976863861084, 
    21.7594203948975, 22.5495471954346, 23.3691310882568), rgdpe = c(4000.837890625, 
    3934.59619140625, 3882.55322265625, 3927.7529296875, 4201.69677734375, 
    4269.41748046875, 4308.62158203125, 4532.29345703125, 4572.1005859375, 
    4424.11865234375, 3971.60205078125, 37389.5859375, 37317.37109375, 
    42393.3671875, 44311.0546875, 52615.54296875, 65769.65625, 
    83384, 91420.0234375, 109108.0078125, 89716.453125, 126393.3203125
    ), rgdpo = c(3892.32348632812, 4312.86328125, 3251.35205078125, 
    3331.43383789062, 3727.60400390625, 3958.794921875, 4168.10546875, 
    4233.91845703125, 4455.19775390625, 4180.31884765625, 3767.7861328125, 
    32316.541015625, 34724.8828125, 39094.16796875, 42965.86328125, 
    51902.34375, 70721.609375, 94126.828125, 107016.71875, 132309.03125, 
    101159.71875, 139946.859375)), row.names = c(51L, 52L, 53L, 
54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 119L, 120L, 121L, 122L, 
123L, 124L, 125L, 126L, 127L, 128L, 129L), class = "data.frame")

Създадох следната функция, за да получа средния темп на растеж за 5 години.

    growth5<-function(x){
    grorat<-(x/lag(x, k = 5))^(1/5)-1
    return(grorat)}

И след като използвах mutate от dplyr по този начин,

pwt <- pwt %>% group_by(code) %>% mutate(across(c(rgdpe:rgdpo), ~ growth5(.), .names = "{col}_grow"))

Въпреки това, както ще видите, получавам само 0 в новите колони (нови променливи) и няма NA там, където очаквах.

Много ви благодаря предварително!


person Reynaldo Senra    schedule 02.09.2020    source източник
comment
Здравейте, моля, споделете данни по подходящия начин, прочетете как -to-make-a-great-r-reproducible-example. В минимален пример никога не са необходими всички данни. Също така посочете всички library разговори, които сте използвали.   -  person jay.sf    schedule 02.09.2020
comment
хм С изключение на грешка, тъй като q_gdp не е в набора от данни, вашият код работи добре. Единственият пакет, който заредих в моята сесия, беше dplyr.   -  person stefan    schedule 02.09.2020
comment
Скъпи стефане, много ти благодаря. изглежда имаше конфликт с lag(), защото бях заредил dplyr и stats едновременно и и двете използват lag(). Сега е почти добре, но получавам само един NA ред за всяка първа година и се предполага, че ще доведе до NA редове през първите 4 години. Всъщност получените темпове на растеж не са верни. Въпреки това, в примера на pieterbons работи перфектно. Някакъв намек?   -  person Reynaldo Senra    schedule 02.09.2020


Отговори (2)


Можете да използвате функцията lag() от пакета dplyr, за да постигнете това. В следващия пример можете да видите, че първите 4 стойности в лагирания вектор са NA, а след това петият запис е резултат от вашата формула за темп на растеж:

library(dplyr)

test <- (1:10)^2

growthrate <- function(x) { 
  (x/lag(x,5)^(1/5)-1)
   }

growthrate(test)

[1]       NA       NA       NA       NA       NA 35.00000 36.13506 40.24122 45.52228 51.53056

person pieterbons    schedule 02.09.2020
comment
Уважаеми pieterbons, много ви благодаря за бързия отговор. Въпреки това търся среден темп на растеж (x/x[-5])^(1/5)-1. Нещо като това. - person Reynaldo Senra; 02.09.2020
comment
съжалявам, грешно съм разбрал. Коригирах отговора. Не сте сигурни защо вашият собствен код не работи, тъй като изглежда много подобен. Уверете се, че използвате функцията lag() от dplyr, а не от пакета stats. - person pieterbons; 02.09.2020
comment
скъпи pieterbons, много ви благодаря отново. Не е за вярване, функцията работи добре във вашия пример, но не изчислява правилно средните темпове на растеж в моята база данни. наистина, оставя 5-те NA реда (оставя само един NA ред) - person Reynaldo Senra; 03.09.2020

най-накрая получих решение, изключващо създаването на растежа на функцията, така че просто трябваше да напиша следния ред

pwt <- pwt %>% group_by(code) %>% mutate(across(c(rgdpe:rgdpo), ~ (./lag(., 5))^(1/5)-1, .names = "{col}_grow"))

Все още обаче не знам защо опцията в първоначалния ми пост нито изчислява правилно темповете на растеж, нито оставя 5 реда NA в началото на всеки код (кодове на държави) в базата данни.

person Reynaldo Senra    schedule 02.09.2020