如何为包含整行NA的dataframe添加分组百分比列?
解决方法
我们可以用dplyr包实现按NA分隔的组计算百分比,步骤如下:
- 构造分组标识:把连续的非NA行划分为同一组,NA行的分组标识设为NA
- 按分组标识分组,计算每组内
Freq的占比并格式化为百分比字符串 - 清理临时分组列
完整代码
library(dplyr) # 原始数据框 df <- data.frame(name = c('a','b','c',NA,NA,'d','e',NA,NA,'f','g','h'), Freq = c(10,20,70,NA,NA,40,60,NA,NA,80,10,10)) # 生成目标结果 df_result <- df %>% # 生成分组标识:连续非NA行归为同一组 mutate(group = ifelse(is.na(name), NA, cumsum(is.na(lag(name, default = NA))))) %>% # 按分组计算百分比 group_by(group) %>% mutate(per = ifelse(is.na(Freq), NA, paste0(round(Freq / sum(Freq, na.rm = TRUE) * 100), "%"))) %>% ungroup() %>% # 移除临时分组列 select(-group) # 查看结果(统一NA显示格式) print(df_result, na.print = "NA")
输出结果
name Freq per 1 a 10 10% 2 b 20 20% 3 c 70 70% 4 <NA> NA NA 5 <NA> NA NA 6 d 40 40% 7 e 60 60% 8 <NA> NA NA 9 <NA> NA NA 10 f 80 80% 11 g 10 10% 12 h 10 10%
代码说明
mutate(group = ...):通过cumsum和lag函数识别连续非NA的块,为每个块分配唯一组号,NA行的组号设为NAgroup_by(group):按组号分组,确保每组内的百分比计算仅针对当前非NA块paste0(round(...), "%"):将比例转换为带百分号的字符串,round用于取整(若需保留小数可调整参数,比如round(..., 1))na.print = "NA":让打印结果中NA显示为统一格式,和示例匹配
内容的提问来源于stack exchange,提问作者An116
相关产品推荐
相关产品推荐

