R语言:跨行数不同DataFrame列值对比及箱篮优先级匹配问题
问题2:箱篮匹配功能的错误分析与解决方案
先拆解你现有代码的几个核心问题:
- 循环覆盖问题:你的嵌套循环里,每处理一个箱子(i循环),都会遍历所有篮子重新赋值
df.basket$box[j],最后只有最后一个箱子的匹配结果会保留,前面的匹配完全被覆盖。 - 未处理篮子占用:规则要求高优先级箱子优先占高优先级篮子,但你的代码没标记篮子是否已被匹配,会出现多个箱子抢同一个篮子的情况。
- 放入条件逻辑错误:你写的
(boxX <= basketX | boxY <= basketX) & (boxX <= basketY | boxY <= basketY)不能正确判断旋转适配的情况——正确逻辑应该是:箱子的最大边长 ≤ 篮子的最大边长,且箱子的最小边长 ≤ 篮子的最小边长,这样不管怎么转都能放进去。
正确实现方案(Base R)
# 原始数据 df.boxes <- structure(list(boxID = c("box 1", "box 2", "box 3", "box 4", "box 5"), boxX = c(600,450, 400, 350, 200), boxY = c(600, 400, 450, 500, 300), importance = c(555, 444, 333, 222, 111) ), class = "data.frame", row.names = c(NA, -5L)) df.basket <- structure(list(basketID = c("basket 1", "basket 2", "basket 3","basket 4", "basket 5", "basket 6", "basket 8"), basketX = c(500,650, 500,200, 450, 500,300), basketY = c(450,650, 500,300,450,500, 300), priorityOfSelection = c(1, 2, 3, 4, 5,6,7) ), class = "data.frame", row.names = c(NA, -7L)) # 1. 排序:箱子按优先级降序,篮子按优先级升序 df.boxes_sorted <- df.boxes[order(-df.boxes$importance), ] df.basket_sorted <- df.basket[order(df.basket$priorityOfSelection), ] # 2. 给篮子添加匹配标记和结果列 df.basket_sorted$is_matched <- FALSE df.basket_sorted$boxes <- "none" # 3. 逐个处理箱子 for (i in 1:nrow(df.boxes_sorted)) { current_box <- df.boxes_sorted[i, ] box_max <- max(current_box$boxX, current_box$boxY) box_min <- min(current_box$boxX, current_box$boxY) # 只遍历未被匹配的篮子 for (j in which(!df.basket_sorted$is_matched)) { current_basket <- df.basket_sorted[j, ] basket_max <- max(current_basket$basketX, current_basket$basketY) basket_min <- min(current_basket$basketX, current_basket$basketY) # 判断是否可放入 if (box_max <= basket_max && box_min <= basket_min) { df.basket_sorted$boxes[j] <- current_box$boxID df.basket_sorted$is_matched[j] <- TRUE break # 找到第一个匹配的篮子就停止,处理下一个箱子 } } } # 还原为原始篮子顺序查看结果 df.basket_final <- df.basket_sorted[match(df.basket$basketID, df.basket_sorted$basketID), ] print(df.basket_final)
代码说明:
- 排序确保高优先级的箱子和篮子先参与匹配
is_matched标记避免篮子被重复分配- 用最大/最小边长判断放入逻辑,完全符合“可旋转适配”的要求
- 每个箱子找到第一个匹配的篮子后立即跳出循环,严格遵循“优先尝试高优先级篮子”的规则
运行后你会看到,高优先级箱子都匹配到了可用的最高优先级篮子,未被匹配的篮子boxes列保持"none"。
内容的提问来源于stack exchange,提问作者eyei
相关产品推荐
相关产品推荐

