【问题标题】:Obtaining year-on-year percentage change by group按组获取同比百分比变化
【发布时间】:2015-10-27 01:40:14
【问题描述】:

我正在使用与提取相对应的数据集:

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

我想为数据集中表示的每个cohort 生成一个具有同比百分比变化的变量。我尝试使用下面的代码(from this discussion):

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

编辑

回答有用的cmets,输出的格式应该对应下表:

原始data.frame 没有其他变化,除了为每个群组的选定变量提供不同年份的百分比变化值的列。

【问题讨论】:

    标签: r dataframe time-series transform


    【解决方案1】:

    我不确定我是否正确理解了您希望输出的样子,但这就是您所追求的吗?

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

    如果您希望百分比为 0-100 而不是 0-1,请将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
    

    【讨论】:

    • 出于好奇,如果不中继其他软件包,是否难以实现类似的解决方案?
    猜你喜欢
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多