繁体   English   中英

计算R中循环(子集)的增长率

[英]Calculating growth rates in a loop (subsets) in R

我正在尝试计算2000-2006年(REF_YEAR)每个NUTS2地区(列NUTS_CODE)的总体增长率。

我的数据集如下所示:

  NUTS_CODE NUTS_LEVEL SCENARIO_ID REF_YEAR IND_VALUE NUTS_C
  <chr>          <dbl>       <dbl>    <dbl>     <dbl> <chr> 
1 BE10               2           1     2000     49434 BE    
2 BE21               2           1     2000     29019 BE    
3 BE22               2           1     2000     20646 BE    
4 BE23               2           1     2000     21155 BE    
5 BE24               2           1     2000     24963 BE    
6 BE25               2           1     2000     22912 BE  

所以我正在尝试计算类似

(BE10(which(REF_YEAR == 2006 - BE10(which(REF_YEAR==2000))/BE10(which(REF_YEAR==2000)

(这不是我的实际代码-我只想解释一下我要实现的目标),并且需要对每个NUTS_CODE进行此操作。

我试图通过同时使用for循环和dplyr函数来实现这一点,但是以某种方式它不起作用。

library(dplyr)

data$growth<-NA

for(i in 1:nrow(data))
{
  if((data%>%filter(NUTS_CODE == data$NUTS_CODE[i] &
                   SCENARIO_ID == data$SCENARIO_ID[i] &
                   REF_YEAR == (data$REF_YEAR[i]-1)
                   )%>%nrow()
      ) == 0
  )
  {
    data$growth[i]<-0
  } else {
    data$growth[i]<-(((data$IND_VALUE[i]-
                         (data%>%filter(NUTS_CODE == data$NUTS_CODE[i] &
                                          SCENARIO_ID == data$SCENARIO_ID[i] &
                                          REF_YEAR == (data$REF_YEAR[i]==2006) 
                         )
                         )[,"IND_VALUE"]
    )/
      (
        (data%>%filter(NUTS_CODE == data$NUTS_CODE[i] &
                         SCENARIO_ID == data$SCENARIO_ID[i] &
                         REF_YEAR == (data$REF_YEAR[i]==2000) 
        )
        )[,"IND_VALUE"]
      )
    )
    *100)
  }
  print(paste("",i,sep = " "))
}

我没有收到错误或警告,但是在data $ growth中,我得到了一整列numeric(0)而不是实际值。

感谢帮助!

library(dplyr)

data %>%
  group_by(NUTS_CODE) %>% 
  summarise(growth_rate = (IND_VALUE[REF_YEAR == 2006] -IND_VALUE[REF_YEAR == 2000]) / IND_VALUE[REF_YEAR == 2000] )

您可以执行以下操作。 这将计算所有年份的增长率,而不仅仅是2006年(基年== 2000)。

library(tidyverse)

result <- data %>%
  arrange(NUTS_CODE, SCENARIO_ID, REF_YEAR) %>%
  group_by(NUTS_CODE, SCENARIO_ID) %>% 
  mutate(base_rate = first(IND_VALUE),
         growth_rate = (IND_VALUE - base_rate)/base_rate) %>%
  select(-base_rate)

head(result)
## A tibble: 6 x 5
## Groups:   NUTS_CODE, SCENARIO_ID [1]
#  NUTS_CODE SCENARIO_ID REF_YEAR IND_VALUE growth_rate
#  <fct>           <int>    <int>     <int>       <dbl>
#1 BE10                1     2000     27451      0     
#2 BE10                1     2001     38529      0.404 
#3 BE10                1     2002     34339      0.251 
#4 BE10                1     2003     33188      0.209 
#5 BE10                1     2004     24835     -0.0953
#6 BE10                1     2005     20901     -0.239 

如果只需要2006年,则可以filter这些年。

result %>% filter(REF_YEAR == 2006)
## A tibble: 12 x 5
## Groups:   NUTS_CODE, SCENARIO_ID [12]
#   NUTS_CODE SCENARIO_ID REF_YEAR IND_VALUE growth_rate
#   <fct>           <int>    <int>     <int>       <dbl>
# 1 BE10                1     2006     21257     -0.226 
# 2 BE10                2     2006     41013      0.460 
# 3 BE10                3     2006     29346      0.423 
# 4 BE10                4     2006     46121      1.20  
# 5 BE21                1     2006     45183      0.613 
# 6 BE21                2     2006     31042     -0.289 
# 7 BE21                3     2006     22901     -0.350 
# 8 BE21                4     2006     45526      0.393 
# 9 BE22                1     2006     24590     -0.0947
#10 BE22                2     2006     47944      0.642 
#11 BE22                3     2006     32856      0.0639
#12 BE22                4     2006     40373      0.759 

测试数据创建代码。

NUTS_CODE <- sprintf("BE%02d", c(10, 21:22))
SCENARIO_ID <- 1:4
REF_YEAR <- 2000:2006

data <- expand.grid(NUTS_CODE, SCENARIO_ID, REF_YEAR)
names(data) <- c("NUTS_CODE", "SCENARIO_ID", "REF_YEAR")

set.seed(1234)
data$IND_VALUE <- sample(20000:50000, nrow(data), TRUE)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM