如何在数据集

时间:2016-11-10 23:26:39

标签: r

我的数据集如下所示:

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))
    }
  }
}

1 个答案:

答案 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