如何无硬编码实现:邻列NA截断列求和及列间除法?
解决方案:基于相邻列NA截断求和并计算列间比值
核心思路
针对含DATE列的数据表,先分离数值列,再根据下一列第一个NA的位置确定当前列的截断求和范围(最后一列则依据自身第一个NA位置),完成求和后计算列间比值,全程无需硬编码列名或数量。
代码实现(R语言)
library(dplyr) library(tibble) # 1. 构造示例数据(替换为你的实际数据表即可) df <- tibble( DATE = c("07/01/2022", "08/01/2022", "09/01/2022"), `1` = c(2, 1, 3), `2` = c(12, 1, NA), `3` = c(12, NA, NA) ) # 2. 分离DATE列与数值列 num_cols <- df %>% select(-DATE) # 3. 定义函数:计算单列的截断行索引 get_cutoff_row <- function(col_idx, df_num) { if (col_idx < ncol(df_num)) { # 非最后一列:取下一列第一个NA的位置减1,无NA则取全部行 next_col_first_na <- which(is.na(df_num[[col_idx + 1]]))[1] cutoff <- ifelse(is.na(next_col_first_na), nrow(df_num), next_col_first_na - 1) } else { # 最后一列:取自身第一个NA的位置减1,无NA则取全部行 curr_col_first_na <- which(is.na(df_num[[col_idx]]))[1] cutoff <- ifelse(is.na(curr_col_first_na), nrow(df_num), curr_col_first_na - 1) } max(cutoff, 1) # 确保至少取第一行 } # 4. 生成每列的截断行索引 cutoff_rows <- sapply(1:ncol(num_cols), get_cutoff_row, df_num = num_cols) # 5. 执行截断求和 total_vals <- mapply(function(col, cutoff) sum(col[1:cutoff], na.rm = TRUE), num_cols, cutoff_rows) total_df <- tibble(category = "TOTAL", !!!set_names(total_vals, names(num_cols))) # 6. 计算列间比值(后一列 ÷ 前一列) ratio_vals <- total_vals[-1] / total_vals[-length(total_vals)] ratio_df <- tibble(category = "RATIO", !!!set_names(ratio_vals, paste0(names(num_cols)[-1], "/", names(num_cols)[-length(num_cols)]))) # 7. 合并最终结果 final_result <- bind_rows(total_df, ratio_df) # 查看结果 print(total_df) print(final_result)
结果说明
- 运行代码后,
total_df会输出你需要的截断求和结果:# A tibble: 1 × 4 category `1` `2` `3` <chr> <dbl> <dbl> <dbl> 1 TOTAL 3 12 12 final_result会同时包含求和结果与列间比值:# A tibble: 2 × 4 category `1` `2` `3` <chr> <dbl> <dbl> <dbl> 1 TOTAL 3 12 12 2 RATIO NA 4 1
为什么adorn_table没成功?
janitor::adorn_totals()是对整列进行求和/汇总,无法根据相邻列的NA位置动态截断求和范围,因此需要自定义逻辑实现需求。
内容的提问来源于stack exchange,提问作者nwk123
相关产品推荐
相关产品推荐

