基于分组条件修正R语言DataFrame中Cost值的问题求助
解决方法
你的原代码错误在于按group和month分组后,每个分组仅包含单一group的记录,无法在同组内获取对应月份的Bottle成本,且summarise会聚合数据,破坏原有的行结构。下面提供两种符合需求的dplyr解决方案:
方法一:按月份分组直接修改成本
通过month分组,在每个月份组内为Apple Juice的成本减去同组Bottle的成本,同时保留所有原行数据:
library(dplyr) # 原始数据 df <- data.frame(group = c("Apple Juice", "Apple Juice", "Apple Juice", "Bottle", "Bottle", "Bottle"), month = c(1,2,3,1,2,3), cost = c(10,10,10,4,4,4)) # 修正后的代码 df <- df %>% group_by(month) %>% mutate(cost = ifelse(group == "Apple Juice", cost - cost[group == "Bottle"], cost)) %>% ungroup()
执行后结果:
# A tibble: 6 × 3 group month cost <chr> <dbl> <dbl> 1 Apple Juice 1 6 2 Apple Juice 2 6 3 Apple Juice 3 6 4 Bottle 1 4 5 Bottle 2 4 6 Bottle 3 4
方法二:宽转长格式计算
先将数据转为宽格式(每个月份一行,包含Apple Juice和Bottle的成本),计算差值后再转回长格式:
library(dplyr) library(tidyr) df <- df %>% pivot_wider(names_from = group, values_from = cost) %>% mutate(`Apple Juice` = `Apple Juice` - Bottle) %>% pivot_longer(cols = c(`Apple Juice`, Bottle), names_to = "group", values_to = "cost") %>% arrange(group, month)
该方法逻辑更直观,适合复杂的多组成本计算场景。
内容的提问来源于stack exchange,提问作者Drahal
相关产品推荐
相关产品推荐

