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

如何为包含整行NA的dataframe添加分组百分比列?

解决方法

我们可以用dplyr包实现按NA分隔的组计算百分比,步骤如下:

  1. 构造分组标识:把连续的非NA行划分为同一组,NA行的分组标识设为NA
  2. 按分组标识分组,计算每组内Freq的占比并格式化为百分比字符串
  3. 清理临时分组列

完整代码

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行的组号设为NA
  • group_by(group):按组号分组,确保每组内的百分比计算仅针对当前非NA块
  • paste0(round(...), "%"):将比例转换为带百分号的字符串,round用于取整(若需保留小数可调整参数,比如round(..., 1))
  • na.print = "NA":让打印结果中NA显示为统一格式,和示例匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:10:33