【发布时间】:2022-01-13 23:05:33
【问题描述】:
我四处寻找类似的问题,但我发现的所有问题都想按行进行滚动减法。
我想做的是在我的数据框列中滚动减法。具体来说,我想按顺序(从左到右)减去每一列,同时保持当前减去的累积值,作为下一个序列中要减去的“总”列。
我找到了一种对其进行硬编码的方法,但显然它看起来很难看,如果列数与创建的 dfs 数有任何不同,代码就会中断。
假设我们有一个每年每个年龄的人口数据框,总数为每年的 rowSums:
df <- data.frame(Age <- c(1:40),
Total <- rep(500,40),
Y1990 <- rep(100,40),
Y1991 <- rep(100,40),
Y1992 <- rep(100,40))
我想要的结果是通过以下代码实现的:
df1 <- df$Total #or df[2]
df2 <- df1 - df[3]
df3 <- df2 - df[4]
...
dfx <- df(x-1) - df[x+1]
#and then we join them together like so:
final_df <- cbind(df$Age, df1, df2, df3,..., dfx)
#final_df should be the Age column, the Total column (500), df2 should be 400 (500-100 = 400), df3 should be 300, etc. etc.)
我摆弄着循环,但不能完全让第一次/最后一次迭代工作(x+1/x-1 部分一直给我一个错误,即下标超出范围)。我什至尝试在循环中使用“break”或“next”,但我无法完全掌握它。我有大约 70 年的数据,未来可能更多,所以我需要更新我的代码以使其适应未来,以免有数百行“dfx”代码。
我想知道是否有人可以提供一个超级简单的循环或函数来解决这个问题。也许 data.table 解决方案是最简单的,尽管我很难使用 data.table 语法。如果您可以在整个迭代过程中保留变量名称(尽管不是必需的),则可以加分。我只希望我的代码既漂亮又健壮!干杯,谢谢。
【问题讨论】:
标签: r dataframe dplyr data.table tidyverse