Subtract previous year's from value from each grouped row in data frame

前端 未结 3 488
遥遥无期
遥遥无期 2020-12-29 15:46

I am trying to calculated the lagged difference (or actual increase) for data that has been inadvertently aggregated. Each successive year in the data includes values from t

3条回答
  •  盖世英雄少女心
    2020-12-29 16:14

    Kind of hackish but keeping in place your wonderful Reduce you could add mock rows to your df for year 0:

    mockRows <- data.frame(id = 1:5, value = 0, year = 0)
    (df <- rbind(df, mockRows))
    (df <- df[order(df$id, df$year), ])
    
    (diffs <- lapply(split(df, df$id), function(x){diff(x$value)}))
    (df <- df[df$year != 0,])
    
    (df$actual <- Reduce(c, diffs)) # flatten the list of lists
    df[order(as.numeric(rownames(df))),]
    

    This is the output:

       id value year actual
    1   1    21    3      5
    2   2    26    3     16
    3   3    26    3     14
    4   4    26    3     10
    5   5    29    3     14
    6   1    16    2     10
    7   2    10    2      5
    8   3    12    2     10
    9   4    16    2      7
    10  5    15    2     13
    11  1     6    1      6
    12  2     5    1      5
    13  3     2    1      2
    14  4     9    1      9
    15  5     2    1      2
    

提交回复
热议问题