【发布时间】:2021-08-21 21:40:16
【问题描述】:
我有一个包含大量年度数据的数据框。例如,考虑以下玩具示例:
dat <- data.frame(id = 1:2, quantity = 3:4, agg_2002 = 5:6, agg_2003 = 7:8, agg_2020 = 9:10)
我想做的是:
-
在列名集合
names(df)中查找名为“agg_”的列 -
将
names(df)中的“agg_”替换为“change_” -
计算每年的相对变化,例如,
df$change_2002 <- df$agg_2002/df$agg_2002(因为 2002 年是第一年)df$change_2003 <- df$agg_2003/df$agg_2002df$change_2004 <- df$agg_2004/df$agg_2003...一直到 2020 年或列名中带有“agg_”的最新值。
我目前拥有的是以下功能:
func <- function(dat, overwrite = FALSE) {
nms <- grep("agg_[0-9]+$", names(dat), value = TRUE)
revnms <- gsub("agg_", "chg_", nms)
for i = 1:ncol(df) %in% revnms{
dat[, rvnms][i] <- lapply(dat[, rvnms][i], `/`, dat[, rvnms][i-1])
}
dat
}
我正在苦苦挣扎的是索引。如何让 R 递归地进行上述计算而无需手动进行?所需的结果是附加到原始数据框的“chg_”列:
id quantity agg_2002 agg_2003 agg_2020 chg_2002 chg_2003 chg_2020
1 1 3 5 7 9 1 1.40 1.28
2 2 4 6 8 10 1 1.33 1.25
如果可能,我想通过lapply 修改上面指定的函数以产生所需的结果。欢迎所有想法。谢谢。
更新:我更喜欢使用 lapply 或可以容纳不同数据类型的东西
【问题讨论】:
标签: r dataframe recursion lapply