R中的排名偏好匹配
ranked preference matching in R
我不确定如何最好地描述我的问题,但我正在处理一个计划项目。我有一个包含教授、课程和时间段的数据框,以及几列,每列包含一个随机生成的数字。我想使用这些随机数来生成不同的计划选项。
这是我的:
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.Then,然后0.4839778变成了1,因为它是一个没有排定的课程和一个没有填补的时间段的最大数字。
真实数据涉及数百名教授教授不同数量的课程和数百个选项,因此解决方案需要能够工作 group_by() 函数(或类似的东西)并且足够灵活以考虑教授不同数量课程的教授。
有什么想法吗?
这个循环应该在每个选项的基础上处理它,但是 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
我不确定如何最好地描述我的问题,但我正在处理一个计划项目。我有一个包含教授、课程和时间段的数据框,以及几列,每列包含一个随机生成的数字。我想使用这些随机数来生成不同的计划选项。
这是我的:
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.Then,然后0.4839778变成了1,因为它是一个没有排定的课程和一个没有填补的时间段的最大数字。
真实数据涉及数百名教授教授不同数量的课程和数百个选项,因此解决方案需要能够工作 group_by() 函数(或类似的东西)并且足够灵活以考虑教授不同数量课程的教授。
有什么想法吗?
这个循环应该在每个选项的基础上处理它,但是 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