【问题标题】:Calculating percent change over time with a longitudal dataset使用纵向数据集计算随时间变化的百分比
【发布时间】:2019-11-24 17:31:24
【问题描述】:

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

数据位于如下所示的数据框中

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%

【问题讨论】:

  • 这个问题问得好,为什么要编辑让输入和输出不对应?
  • 抱歉,这是个错误。回滚

标签: r time-series data-analysis


【解决方案1】:

使用dplyr 的一种方法是通过从先前的Valuepaste 中减去当前的Value 来计算Change,然后将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  

【讨论】:

    【解决方案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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      相关资源
      最近更新 更多