【发布时间】:2020-03-09 14:41:38
【问题描述】:
同时考虑盒子和篮子的优先级,哪个盒子适合哪个篮子?
df.boxes 有以下列:
boxID - 盒子的名称
boxX - 盒子的大小X 维度中的框
boxY - Y 维度中框的大小
重要性 - 应首先将哪个框分配给篮子。比如优先级——555 最重要(优先级最高),111 最不重要(优先级最低)
df.basket 有以下列:
basketID - 篮子的名称
basketX - 篮子的大小X 维度中的篮子
basketY - Y 维度中篮子的大小
priorityOfSelection - 哪个篮子应该首先装满盒子。 1 - 最高优先级,7 - 最低优先级
例如,box1 不适合具有最高优先级的篮子,也就是篮子 1,因此它会向下移动到优先级为“2”的下一个篮子,并将其名称存储在 df 的新列“boxes”中。篮子。
我有一个想法,首先我根据它们的“重要性”、“priorotyOfSelection”对两个数据框进行排序,并将框的大小与篮子的大小进行比较,如果匹配,我指定框到相应的篮子。按照这种思维顺序,我正在尝试创建嵌套的 for 循环 - 如您所见,不成功。
谁能指出我做错了什么以及在哪里做错了,或者指导我采用另一种方法,这也将不胜感激?
代表
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))
尝试:
for (i in 1:nrow(df.boxes)){
for(j in 1:nrow(df.basket)){
df.basket$box[j] <- ifelse((df.boxes$boxX[i] <= df.basket$basketX[j] | df.boxes$boxY[i] <= df.basket$basketX[j]) & (df.boxes$boxX[i] <= df.basket$basketY[j] | df.boxes$boxY[i] <= df.basket$basketY[j]),
df.boxes$boxID[i], "none")
}
}
非常感谢您的宝贵时间!
【问题讨论】:
-
您可以使用类似的方法来确定一个盒子可以放入哪些篮子,然后因为它们按优先顺序排列,所以只需选择第一个可以放入的篮子。
which(df.basket[,"basketX"]>df.boxes[2,"boxX"] & df.basket[,"basketY"]>df.boxes[2,"boxY"])[1] -
这可以使其自动化。问题是它会覆盖已经使用过的篮子。
for (i in 1:nrow(df.boxes)){ df.basket[which(df.basket$basketX>df.boxes[i,"boxX"] & df.basket$basketY>df.boxes[i,"boxY"])[1], "box"]<-df.boxes[i,"boxID"] } -
感谢您的来信!当我单独运行您的代码时(从第一条评论开始),它可以正确运行到第三个框,并且自动版本让我错误地将框分配到篮子。
-
那是它覆盖造成的。如果您将 box 列设置为 0,则将其添加为条件,这样它就不会覆盖任何应该修复它的内容。
df.basket[,"box"]<-0 for (i in 1:nrow(df.boxes)){ df.basket[which(df.basket$basketX>=df.boxes[i,"boxX"] & df.basket$basketY>=df.boxes[i,"boxY"] & df.basket$box==0)[1], "box"]<-df.boxes[i,"boxID"] }这给了我与您的示例相同的结果。它为未使用的篮子提供 0 而不是无,但如果需要,您可以轻松更改它。这与@AllanCameron 的建议非常接近。 -
是的,确实,谢谢@Tanner33,我现在得到了预期的结果! :)
标签: r for-loop left-join subset