【发布时间】:2019-08-27 10:21:47
【问题描述】:
我正在尝试计算 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) 而不是实际值。
感谢您的帮助!
【问题讨论】:
-
去掉管道中的
data$,数据集从一开始就已知。我也相信代码可以(很多)更简单,不需要for循环并同时获得所有增长率,group_by/mutate似乎比filter更自然。跨度> -
为了正确,您想计算每个
IND_VALUE的整体增长率NUTS_CODE? -
请记住:在 99% 的情况下(尤其是在数据处理方面)不需要 for 循环,因为它们可能效率低下。
标签: r for-loop dplyr economics