我正在尝试计算某些数据的逐年变化。它是面板/纵向形式
数据在一个看起来像这样的数据框中
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%
答案 0 :(得分:2)
使用dplyr
的一种方法是通过从先前的Change
和Value
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))