按组获取同比百分比变化

5

我正在处理一个与以下数据集对应的数据提取:

set.seed(1)
df <- data.frame(indicator=runif(n = 100),cohort=letters[1:4],
                 year=rep(1976:2000, each=4))

我希望为数据集中每个代表一个cohort的变量生成一个百分比同比增长率。我尝试使用以下代码(来自此讨论):

df$ind_per_chng <- transform(new.col=c(NA,indicator[-1]/indicator[-nrow(df)]-1))

但我对在每个子组中使其运作并仅生成一个额外的列以显示百分比变化非常感兴趣,而不是目前创建的一组列。

> head(df)
  indicator cohort year ind_per_chng.indicator ind_per_chng.cohort ind_per_chng.year
1 0.2655087      a 1976              0.2655087                   a              1976
2 0.3721239      b 1976              0.3721239                   b              1976
3 0.5728534      c 1976              0.5728534                   c              1976
4 0.9082078      d 1976              0.9082078                   d              1976
5 0.2016819      a 1977              0.2016819                   a              1977
6 0.8983897      b 1977              0.8983897                   b              1977
  ind_per_chng.new.col
1                   NA
2            0.4015509
3            0.5394157
4            0.5854106
5           -0.7779342
6            3.4544877

编辑

为了回答有用的评论,输出的格式应与下表对应:

desired format

原始data.frame没有其他更改,除了提供每个年级对所选变量的百分比变化值的列。

1个回答

13

我不确定我是否正确理解您想要的输出是什么样子的,但这就是您想要的吗?

library(dplyr)
df2 <- df%>%
    group_by(cohort) %>%
    arrange(year) %>%
    mutate(pct.chg = (indicator - lag(indicator))/lag(indicator))

如果你想要将百分比从0-1转换为0-100的比例,只需在最后一行添加100 * (),如下所示:mutate(pct.chg = 100 * ((indicator - lag(indicator))/lag(indicator)))。以下是结果展示:

  indicator cohort year    pct.chg
1 0.2655087      a 1976         NA
2 0.2016819      a 1977 -24.039416
3 0.6291140      a 1978 211.933767
4 0.6870228      a 1979   9.204818
5 0.7176185      a 1980   4.453369
6 0.9347052      a 1981  30.250993

出于好奇,如果不依赖于额外的软件包,实现类似的解决方案是否困难? - Konrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接