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
相关产品推荐
相关产品推荐

