如何按ID分组添加指定行数 实现R语言数据反聚合操作
R实现数据行反聚合的解决方法
原有代码问题说明
你原来的代码仅调用add_row(.)默认只会新增1行,没有匹配Allocated和Remaining字段的计数规则,因此无法实现指定行数的批量新增。
实现方案
方案1:tidyr::uncount 简洁实现(推荐)
uncount是tidyr专门用于按计数字段展开行的函数,配合长表转换即可快速实现需求:
- 先加载依赖包
library(dplyr) library(tidyr)
- 数据处理代码
# 构造示例数据 df <- data.frame( ID = c("A", "B", "C"), Allocated = c(2, 1, 0), Remaining = c(4, 2, 1) ) # 反聚合处理 df_result <- df %>% # 提取每个ID对应1和0的生成数量 mutate(n_1 = Allocated, n_0 = Remaining) %>% select(ID, n_1, n_0) %>% # 转为长表结构 pivot_longer(cols = -ID, values_to = "count") %>% # 生成Sourced字段值 mutate(Sourced = as.integer(name == "n_1")) %>% # 按计数展开为多行 uncount(count) %>% select(ID, Sourced)
运行后输出结果完全匹配你给出的目标表结构。
方案2:适配原有group_by + do的思路
如果你要沿用分组后逐组处理的逻辑,可以在do内直接生成指定长度的Sourced向量:
df_result <- df %>% group_by(ID) %>% do(data.frame( Sourced = rep(c(1, 0), c(.$Allocated, .$Remaining)) )) %>% ungroup()
该写法逻辑和你最初的实现思路完全一致:每组先生成Allocated个值为1的行,再生成Remaining个值为0的行,拼接后得到最终结果。
内容的提问来源于stack exchange,提问作者Claire
相关产品推荐
相关产品推荐

