如何在R中按姓名分组生成固定/可变/总成本统计列
在R中按姓名分组计算固定/可变/总成本
你的原始数据是行作为变量、列作为观测的非标准格式,得先转成标准长格式再做分组计算,下面是完整的实现步骤:
1. 还原原始数据(和你提供的结构一致)
先把你给出的表格转换成R能识别的dataframe:
original_df <- data.frame( row_names = c("Name", "Amount_Type", "Amount"), X1 = c("Max", "InternetBill", "$75"), X2 = c("Max", "Groceries", "$230.66"), X3 = c("Max", "WaterBill", "$40"), X4 = c("Joey", "InternetBill", "$70"), X5 = c("Joey", "Groceries", "$188.75"), X6 = c("Nancy", "WaterBill", "$35"), X7 = c("Nancy", "Groceries", "$175.89"), X8 = c("Nancy", "InternetBill", "$75"), X9 = c("Linda", "WaterBill", "$30"), X10 = c("Linda", "Groceries", "$236.87") )
2. 转置并清理数据格式
用tidyverse工具包把数据转成每一行对应一条消费记录的标准格式,同时把带$的金额转成数值型方便计算:
# 先安装并加载tidyverse(如果没装过) # install.packages("tidyverse") library(tidyverse) clean_df <- original_df %>% # 把列转成行,统一整理成键值对 pivot_longer(cols = starts_with("X"), names_to = "id", values_to = "value") %>% # 把行变量转成列,得到标准结构 pivot_wider(names_from = row_names, values_from = "value") %>% # 去掉金额里的$符号,转成数值 mutate(Amount = as.numeric(gsub("\\$", "", Amount)))
3. 分组计算目标成本列
按Name分组,分别计算固定成本、可变成本和总成本,最后把数值转回带$的格式:
result_df <- clean_df %>% group_by(Name) %>% summarise( # 固定成本:汇总网络费和水费 Fixed_Cost = sum(Amount[Amount_Type %in% c("InternetBill", "WaterBill")]), # 可变成本:汇总Groceries费用 Variable_Cost = sum(Amount[Amount_Type == "Groceries"]), # 总成本:固定+可变 Total_Cost = Fixed_Cost + Variable_Cost ) %>% # 给金额加上$符号,匹配目标输出格式 mutate(across(c(Fixed_Cost, Variable_Cost, Total_Cost), ~paste0("$", .x))) # 查看最终结果 print(result_df)
运行后就能得到你想要的输出结构:
# A tibble: 4 × 4 Name Fixed_Cost Variable_Cost Total_Cost <chr> <chr> <chr> <chr> 1 Joey $70 $188.75 $258.75 2 Linda $30 $236.87 $266.87 3 Max $115 $230.66 $345.66 4 Nancy $110 $175.89 $285.89
补充说明
如果你已经有了转置好的长格式数据(每一行是一条消费记录),可以直接跳过前两步,从分组计算的代码开始执行。
内容的提问来源于stack exchange,提问作者Elena
相关产品推荐
相关产品推荐

