在R中进行排名偏好匹配

4

我不确定如何最好地描述我的问题,但我正在处理一个调度项目。我有一个数据框,包含教授、课程和时间段,以及几列每列都包含随机生成的数字。我希望使用这些随机数来生成不同的日程安排选项。

这是我目前拥有的:

  Prof     Courses   Time      Option_1  Option_2
  John     Course A   Time 1   0.7765824 0.3102492
  John     Course A   Time 2   0.5636233 0.4839778
  John     Course B   Time 1   0.5814365 0.7282360
  John     Course B   Time 2   0.2623851 0.5198096

同时,这就是我所期望的:

  Prof     Courses   Time      Option_1  Option_2
  John     Course A   Time 1   1         0
  John     Course A   Time 2   0         1
  John     Course B   Time 1   0         1
  John     Course B   Time 2   1         0

对于选项1,0.7765824 是最高的数字,所以它会变成1-意味着课程将在那个时间段教授。下一个最高的数字是0.2623851,表示未安排课程和已填充时间槽的情况,所以它被更改为1。
对于选项2,0.7282360 是最高的数字,所以它变为1。然后,0.4839778 变为1,因为它是未安排课程且时间槽未填满的最高数字。
真实数据涉及到数百名教授教授不同数量的课程和数百个选项,因此解决方案需要能够使用group_by()函数(或类似的函数),并且足够灵活以考虑教授教授不同数量的课程。
有什么想法?

1
这是dput:structure(list(Prof = c("John", "John", "John", "John"), Courses = c("Course A", "Course A", "Course B", "Course B"), Time = c("Time 1", "Time 2", "Time 1", "Time 2"), Option_1 = c(0.7765824, 0.5636233, 0.5814365, 0.2623851), Option_2 = c(0.3102492, 0.4839778, 0.728236, 0.5198096)), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame")) - Matt
对于选项_1,如果您使用c(0,1,1,0),则得分总和比使用c(1,0,0,1)更高。这些随机生成的数字是什么?它们是否表示学生的偏好,并且您正在尝试找到最大化此分数的最佳时间表? - chinsoon12
1个回答

1
这个循环应该基于每个选项进行处理,但是df会按新顺序返回。
df <- df[order(df$Option_1,decreasing =T),]
coursesdone <- c("FakeCourse")
timedone <- c("FakeTime")
for(i in 1:length(unique(df$Courses))){
    available <- df$Courses != coursesdone & df$Time != timedone
    df$Option_1[available][1] = 1
    df$Option_1[df$Courses == df$Courses[available][1] & df$Time != df$Time[available][1]] <- 0 
    coursesdone[i] <- as.character(df$Courses[available][1])
    timedone[i] <- as.character(df$Time[available][1])
}

但是我们可以为您拥有的任何选项堆叠循环。
df <- df[order(df$Option_2,decreasing =T),]
coursesdone <- c("FakeCourse")
timedone <- c("FakeTime")
for(i in 1:length(unique(df$Courses))){
    available <- df$Courses != coursesdone & df$Time != timedone
    df$Option_2[available][1] = 1
    df$Option_2[df$Courses == df$Courses[available][1] & df$Time != df$Time[available][1]] <- 0 
    coursesdone[i] <- as.character(df$Courses[available][1])
    timedone[i] <- as.character(df$Time[available][1])
}

在两个循环都被执行后,获得最终输出。

> df 
  Prof Courses  Time Option_1 Option_2
3 John CourseB Time1        0        1
4 John CourseB Time2        1        0
2 John CourseA Time2        0        1
1 John CourseA Time1        1        0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接