You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:宽表NA替换为0及添加行列总计的实现问询

解决方案:处理R宽表NA值并添加行列总计

问题1:替换宽表中的NA为0

你之前的代码报错,是因为group_by(AUX) %>% summarise(n = sum(n, na.rm = TRUE))会把每个AUX对应的所有Century的n值求和,直接丢失了Century的分组信息,导致后续spread无法生成年份列。下面是两种可行的解决方法:

方法1:补全缺失组合后转宽(推荐)

先用tidyr::complete生成所有可能的AUX-Century组合,缺失的n值直接填充为0,再转宽格式:

library(dplyr)
library(tidyr)

wide.verb.century <- verb.century.counts %>%
  complete(AUX, Century, fill = list(n = 0)) %>%  # 补全所有AUX-年份组合,缺失n填0
  pivot_wider(names_from = Century, values_from = n)  # 用pivot_wider替代spread(tidyr新版本更易用)

方法2:转宽后批量替换NA

如果已经生成了带NA的宽表,直接用dplyr::mutate(across())批量替换数值列的NA为0:

wide.verb.century <- wide.verb.century %>%
  mutate(across(where(is.numeric), ~replace_na(.x, 0)))

问题2:添加行总计列与列总计行

步骤1:添加行总计列

用rowSums计算每行数值列的总和,新增Total列:

wide.verb.century <- wide.verb.century %>%
  mutate(Total = rowSums(across(where(is.numeric))))

步骤2:添加列总计行

先计算各数值列的总和,构造一个标记为Total的新行,再合并到原表:

total_row <- wide.verb.century %>%
  summarise(
    AUX = "Total",
    across(where(is.numeric), sum)
  )

wide.verb.century <- bind_rows(wide.verb.century, total_row)

完整整合代码

把所有步骤整合,一步到位完成转宽、NA替换、添加总计:

library(dplyr)
library(tidyr)

wide.verb.century <- verb.century.counts %>%
  complete(AUX, Century, fill = list(n = 0)) %>%
  pivot_wider(names_from = Century, values_from = n) %>%
  mutate(Total = rowSums(across(where(is.numeric)))) %>%
  bind_rows(
    summarise(., 
              AUX = "Total",
              across(where(is.numeric), sum)
    )
  )

注:如果使用旧版tidyr,可以把pivot_wider替换为spread(Century, n),效果一致。

内容的提问来源于stack exchange,提问作者Freya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:07:13