R语言如何基于分类列条件对金额列求和并新增保留两位小数的汇总列
原代码错误点
你的代码运行不符合预期,是几个核心逻辑和语法错误导致的:
AMOUNT列存储为带$前缀的字符串,无法直接参与数值计算,必须先清洗转换为数值类型- 类别匹配误用
&逻辑符:单个DESCRIPTION值不可能同时等于多个不同类别,判断值是否属于指定集合要使用%in%操作符 - 多余的
group_by(DESCRIPTION)分组:你需要的是跨多个类别的总金额汇总,按描述分组后每组仅1条记录,无法实现跨条目求和 - 计算逻辑顺序颠倒:原代码中
round()包裹的是逻辑判断结果(TRUE/FALSE会被识别为1/0),没有针对实际金额值计算,且sum()未指定求和对象为AMOUNT - 语法冗余:同一个
mutate()函数内可以直接定义多个新列,不需要嵌套第二个mutate()
正确实现代码
library(dplyr) house_expenses <- house_expenses %>% # 清洗AMOUNT列:移除$符号,转为数值格式 mutate(AMOUNT = as.numeric(gsub("\\$", "", AMOUNT))) %>% # 直接计算两类汇总成本,无需分组 mutate( LIVING_ROOM_COSTS = round( sum(AMOUNT[DESCRIPTION %in% c("COUCH", "TV", "TV_MOUNT", "ENTERTAINMENT_SYSTEM")]), digits = 2 ), BEDROOM_COSTS = round( sum(AMOUNT[DESCRIPTION %in% c("MATTRESS", "BEDFRAME", "PILLOWS")]), digits = 2 ) )
结果验证
按你给出的样例数据计算:
- 客厅类总金额为801.713 + 4999.996 + 575.867 + 1102.392 = 7479.968,四舍五入保留2位后为
7479.97 - 卧室类总金额为1225.893 + 356.789 + 528.989 = 2111.671,四舍五入保留2位后为
2111.67
运行后所有行的LIVING_ROOM_COSTS和BEDROOM_COSTS列会分别填充上述汇总值。
内容的提问来源于stack exchange,提问作者Elena
相关产品推荐
相关产品推荐

