如何调用menu数据框信息计算5种水果排列组合的总价?
带放回水果排列的总价计算方案
需求背景
生成所有带放回选取5个水果的排列,并为每组排列计算总费用,现有代码已生成包含5列水果的permutations数据框,需新增总价列。
解决方案
核心思路是先创建水果-价格的匹配映射,再批量将每行的水果转换为价格并求和,无需单独生成每列价格,效率更高。
步骤1:优化菜单数据(可选,更简洁)
原代码创建menu的方式可以简化,直接合并成一个数据框:
menu = data.frame( Fruit = c("apple", "banana", "orange", "pear", "strawberry"), Price = c(0.99, 1.59, 0.70, 1.29, 2.99) )
步骤2:创建价格查找向量
将menu转换为命名向量,用水果名作为名称,价格作为对应值,方便快速匹配:
price_lookup = setNames(menu$Price, menu$Fruit)
步骤3:计算每行总价并添加到数据框
提供两种实现方法:
方法1:基础R(无需额外包)
通过sapply将每列水果转换为价格,再用rowSums求和:
# 生成排列(保留原逻辑) fruit_vector = menu$Fruit permutations = data.frame(expand.grid( Fruit_1 = fruit_vector, Fruit_2 = fruit_vector, Fruit_3 = fruit_vector, Fruit_4 = fruit_vector, Fruit_5 = fruit_vector )) # 添加总价列 permutations$Total_Price = rowSums(sapply(permutations, function(col) price_lookup[col]))
方法2:dplyr包(更直观的行操作)
如果习惯用tidyverse语法,可使用rowwise逐行计算:
library(dplyr) permutations = permutations %>% rowwise() %>% mutate(Total_Price = sum(price_lookup[c(Fruit_1, Fruit_2, Fruit_3, Fruit_4, Fruit_5)])) %>% ungroup()
完整可运行代码
# 创建水果菜单 menu = data.frame( Fruit = c("apple", "banana", "orange", "pear", "strawberry"), Price = c(0.99, 1.59, 0.70, 1.29, 2.99) ) # 生成所有带放回的5个水果排列 fruit_vector = menu$Fruit permutations = data.frame(expand.grid( Fruit_1 = fruit_vector, Fruit_2 = fruit_vector, Fruit_3 = fruit_vector, Fruit_4 = fruit_vector, Fruit_5 = fruit_vector )) # 创建价格查找映射 price_lookup = setNames(menu$Price, menu$Fruit) # 添加总价列 permutations$Total_Price = rowSums(sapply(permutations, function(col) price_lookup[col])) # 查看结果示例 head(permutations)
内容的提问来源于stack exchange,提问作者Tommy Cassilly
相关产品推荐
相关产品推荐

