我正在尝试计算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)而不是实际值。
感谢您的帮助!
答案 0 :(得分: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] )
答案 1 :(得分:0)
您可以执行以下操作。这样可以计算出所有年份的增长率,而不仅仅是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)