使用纵向数据集计算随时间变化的百分比

时间:2019-07-16 02:59:00

标签: r time-series data-analysis

我正在尝试计算某些数据的逐年变化。它是面板/纵向形式

数据在一个看起来像这样的数据框中

Year    ZipCode     Value
2011    11411         5
2012    11411         10
2013    11411         20
2011    11345         6
2012    11345         7 
2013    11345         10

我想要一个以这种形式出现的数据框

Year Differnce    Zipcode    % Change
2011-2012         11411        100%
2012-2013         11411        100%
2011-2012         11345        16%
2012-2013         11345        42%

2 个答案:

答案 0 :(得分:2)

使用dplyr的一种方法是通过从先前的ChangeValue Value中减去当前paste来计算Year ZipCode

library(dplyr)

df %>%
  group_by(ZipCode) %>%
  mutate(Change = (Value - lag(Value))/lag(Value) * 100, 
         Year_Diff = paste(lag(Year), Year, sep = "-")) %>%
  slice(-1) %>%
  select(Year_Diff, ZipCode, Change)

#  Year_Diff ZipCode Change
#  <chr>       <int>  <dbl>
#1 2011-2012   11345   16.7
#2 2012-2013   11345   42.9
#3 2011-2012   11411  100  
#4 2012-2013   11411  100  

答案 1 :(得分:2)

我们使用data.table将'ZipCode'分组,取{Value的diff,除以调整后的'Value'长度,同时paste将相邻的'Year'合并在一起

library(data.table)
setDT(df1)[, .(Change  = 100 *diff(Value)/Value[-.N], 
    Year_Diff = paste(Year[-.N], Year[-1], sep="-")),  .(ZipCode)]
#    ZipCode    Change Year_Diff
#1:   11411 100.00000 2011-2012
#2:   11411 100.00000 2012-2013
#3:   11345  16.66667 2011-2012
#4:   11345  42.85714 2012-2013

数据

df1 <- structure(list(Year = c(2011L, 2012L, 2013L, 2011L, 2012L, 2013L
), ZipCode = c(11411L, 11411L, 11411L, 11345L, 11345L, 11345L
), Value = c(5L, 10L, 20L, 6L, 7L, 10L)), class = "data.frame", 
row.names = c(NA, 
-6L))