【发布时间】:2021-12-22 12:30:21
【问题描述】:
我有一个包含许多组 (series) 的 data.frame df,其中数据 area 每年都会呈现。我正在尝试创建一个新列,其中diff 是第 1 行和第 2 行区域之间的差异。但我需要继续从“新”差异中减去。对于每个series,这需要按year 的降序完成。
df<-
structure(list(series = c("A218t23", "A218t23", "A218t23", "A218t23",
"A218t23", "A218t23", "A218t23", "A218t23", "A218t23"), year = 2018:2010,
area = c(16409.3632611811, 274.5866082, 293.8540619, 323.0603775,
544.7366938, 108.0737561, 134.8579038, 143.14125, 167.8244576
)), row.names = c(NA, -9L), groups = structure(list(series = "A218t23",
.rows = structure(list(1:9), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, -1L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
我想要的输出如下所示:
因此,16409-275=16135
然后,16135-294=15841 等等。
我一直在使用的代码:
df_diffs <- df %>%
dplyr::group_by(series) %>%
dplyr::mutate(diff = area - dplyr::lag(area, default=0, order_by = desc(year)))
但是,这只是返回 area 列中的行之间的滞后差异。我正在寻找的结果是“累积”或运行差异。我已经查看了RcppRoll 和其他一些 SO 帖子,但没有运气。理想情况下,我可以将这一切都保存在一个管道框架内,因为我还有其他功能正在进行。如果有办法将第一行中的 NA 替换为当年对应的面积值,则可以加分。
非常感谢您的建议!
【问题讨论】: