我的数据集如下所示:
Year Risk Resource Utilization Band Percent
2014 0 .25
2014 1 .19
2014 2 .17
2014 3 .31
2014 4 .06
2014 5 .01
2015 0 .23
2015 1 .21
2015 2 .19
2015 3 .31
2015 4 .06
2015 5 .31
我正在尝试比较我正在使用的数据集的年度百分比变化。例如,2014年,2015年下降了2%。到目前为止,我已经创建了一个循环,每年将每个放入垃圾箱并运行计算。我遇到的问题是循环将每个循环索引为1,所以我的计算旁边有一堆重复的1。这是我一直在使用的代码,非常感谢任何帮助
Results.data <- data.frame()
head(data)
percent <- 0
baseyear <- 0
nextyear <- 0
bin <- 0
yearPlus1 <-0
bin2 <-0
percent1 <-0
percent2 <-0
percentDif <-0
for(i in 1:nrow(data))
{
percent[i] <- data$PERCENT[i]
baseyear[i] <- as.numeric(data$YEAR_RISK[i])
bin[i] <- as.numeric(data$RESOURCE_UTILIZATION_BAND[i])
#print(percent[i])
#print(baseyear[i])
#print(bin[i])
}
for (k in 1:nrow(data))
{
for (j in 1:nrow(data))
{
yearPlus1 <- as.numeric(baseyear[j])-1
firstYear <- as.numeric(baseyear[k])
bin2 <-bin[j]
bin1 <- bin[k]
percent1 <- as.numeric(percent[k])
percent2 <- as.numeric(percent[j])
if(firstYear==yearPlus1 && bin1==bin2)
{
percentDif <- percent2 - percent1
print(percentDif)
Results.data <- rbind(Results.data, c(percentDif))
}
}
}
答案 0 :(得分:1)
如果我理解你的问题,你可以使用分组和矢量化来避免循环。以下是使用dplyr
包的示例。
下面的代码首先按Year_Risk
排序,以便按时间正确排序数据。然后我们按Resource_Utilization_Band
进行分组,以便我们可以为Resource_Utilization_Band
的每个级别单独获取结果。最后,我们计算每年Percent
的差异。 lag
函数返回序列中的先前值。 (而不是lag
,我们也可以完成Change = c(NA, diff(Percent))
。)所有这些操作都使用dplyr
链接运算符(%>%
)一个接一个地链接。< / p>
(请注意,当我导入您的数据时,我还通过添加下划线来更改您的列名,以使其成为合法的R列名称。)
library(dplyr)
# Year-over-year change within each Resource_Utilization_Band
# (Assuming your starting data frame is called "dat")
dat %>% arrange(Year_Risk) %>%
group_by(Resource_Utilization_Band) %>%
mutate(Change = Percent - lag(Percent))
Year_Risk Resource_Utilization_Band Percent Change 1 2014 0 0.25 NA 2 2014 1 0.19 NA 3 2014 2 0.17 NA 4 2014 3 0.31 NA 5 2014 4 0.06 NA 6 2014 5 0.01 NA 7 2015 0 0.23 -0.02 8 2015 1 0.21 0.02 9 2015 2 0.19 0.02 10 2015 3 0.31 0.00 11 2015 4 0.06 0.00 12 2015 5 0.31 0.30