在多组domain中用dplyr实现group5减去group1的freq值并保留原数据框
解决方案:用dplyr实现指定组的数值调整
完整代码实现
library(dplyr) # 生成示例数据(与提问中的结构一致) set.seed(123456) domain <- as.factor(rep(c('alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot', 'golf', 'hotel', 'india', 'juliet'), each = 8)) group <- as.factor(rep(c('group 1', 'group 2', 'group 3', 'group 4', 'group 5', 'group 6', 'group 7', 'group 8'), 10)) freq <- signif(rnorm(80, mean = 1750, sd = 500), 1) df <- data.frame(domain, group, freq) # 核心处理逻辑 df_processed <- df %>% group_by(domain) %>% mutate( freq = case_when( group == 'group 5' ~ freq - freq[group == 'group 1'], TRUE ~ freq ) ) %>% ungroup() # 查看目标结果示例 df_processed %>% filter(domain %in% c('alpha', 'bravo', 'charlie'))
代码说明
- 分组处理:通过
group_by(domain)确保每个domain内的计算独立,不会跨domain产生干扰 - 条件修改:用
case_when()精准定位需要调整的行(group为'group 5'的记录),将其freq值替换为「当前group5的freq - 同domain下group1的freq」 - 取消分组:
ungroup()还原数据框的非分组状态,避免影响后续的数据操作
结果验证
运行代码后,目标调整效果符合预期:
- alpha的group5 freq从3000变为1000(3000-2000)
- bravo的group5 freq从2000变为0(2000-2000)
- charlie的group5 freq从1000变为0(1000-1000)
代码可自动适配所有domain,无需手动逐个处理,满足自动化复用需求。
内容的提问来源于stack exchange,提问作者Rlearn
相关产品推荐
相关产品推荐

