如何对数据框最近3行列求和并与相邻列求和结果相除?
数据框列最近3行有效数值求和及列间比值计算
需求说明
对数据框中各列的最近3行有效数值(非NA值)求和,将每列的求和结果除以前一列的求和结果,最后在原表格中添加一行展示这些计算比值。
示例数据
# 示例数据框d d <- structure(list(Date = c("07.10.2021", "08.10.2021", "09.10.2021", "10.10.2021", "11.10.2021", "12.10.2021", "01.10.2022"), X1 = c(20L, 26L, 29L, 20L, 20L, 30L, 39L), X2 = c(25L, 25L, 29L, 29L, 30L, 30L, NA), X3 = c(25L, 25L, 25L, 25L, 30L, NA, NA), X4 = c(26L, 26L, 26L, 31L, NA, NA, NA), X5 = c(26L, 25L, 39L, NA, NA, NA, NA), X6 = c(25L, 31L, NA, NA, NA, NA, NA), X7 = c(31L, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 7L))
代码实现
1. 定义求和函数
编写函数提取列中最近3个非NA值并求和:
sum_last3 <- function(x) { # 剔除NA后取最后3个值,计算求和结果 sum(tail(na.omit(x), 3)) }
2. 计算各列最近3行有效数值的和
对数据框中的数值列(排除Date列)应用上述函数:
# 提取数值列,计算每列的最近3个有效数值之和 col_sums <- sapply(d[, -1], sum_last3)
3. 计算列间比值
生成列间比值向量:第一列无前置列,设为NA;从第二列开始,用当前列求和结果除以前一列求和结果:
ratios <- c(NA, col_sums[-1] / col_sums[-length(col_sums)])
4. 添加结果行到原数据框
将比值构造成新行,追加到原数据框末尾:
# 构造TOTAL行 total_row <- data.frame(Date = "TOTAL", t(ratios)) # 合并到原数据框 d_with_total <- rbind(d, total_row) # 查看最终结果(空值显示为空) print(d_with_total, na.print = "")
最终输出
运行代码后得到的结果如下:
Date X1 X2 X3 X4 X5 X6 X7 1 07.10.2021 20 25 25 26 26 25 31 2 08.10.2021 26 25 25 26 25 31 3 09.10.2021 29 29 25 26 39 4 10.10.2021 20 29 25 31 5 11.10.2021 20 30 30 6 12.10.2021 30 30 7 01.10.2022 39 8 TOTAL 1.000000 0.8988764 1.0375 1.0843373 0.6222222 0.5535714
内容的提问来源于stack exchange,提问作者nwk123
相关产品推荐
相关产品推荐

