R中的优先排序匹配

问题描述 投票:1回答:1

我不确定如何最好地描述我的问题,但是我正在做一个调度项目。我有一个数据框架,其中包含教授,课程和时隙,以及几列,每列包含一个随机生成的数字。我想使用这些随机数生成不同的计划选项。

这是我所拥有的:

  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是最高的数字,因此将其更改为一个-意味着将在该时间段内教授课程。下一个最高编号(对于未计划的课程和已填充的时间段)为0.2623851,因此将其更改为1。

对于选项2,0.7282360是最高编号,因此它更改为1,然后,然后0.4839778更改为1,因为这是未计划课程和未填写时间段的最高编号。

[实际数据涉及数百名教授各种课程的教授和数百种选择,因此该解决方案需要能够使用group_by()函数(或类似方法)并且足够灵活,以应对教授多种课程的教授。培训班。

有什么想法吗?

r matching ranking
1个回答
0
投票

此循环应根据每个选项进行处理,尽管df确实会以新的顺序返回:

df <- df[order(df$Option_1),]
coursesdone <- c("FakeCourse")
for(i in 1:length(unique(df$Courses))){
    df$Option_1[df$Courses != coursesdone][1] = 1
    df$Option_1[!(df$Courses[-1] %in% coursesdone)][-1] <- 0 
    coursesdone[i] <- as.character(df$Courses[df$Courses != coursesdone][1])
}

但是我们可以为您拥有的许多选项堆叠循环

df <- df[order(df$Option_2),]
coursesdone <- c("FakeCourse")
for(i in 1:length(unique(df$Courses))){
    df$Option_2[df$Courses != coursesdone][1] = 1
    df$Option_2[!(df$Courses[-1] %in% coursesdone)][-1] <- 0 
    coursesdone[i] <- as.character(df$Courses[df$Courses != coursesdone][1])
}

获得最终输出(一旦执行了两个循环)

> df 
  Prof Courses  Time Option_1 Option_2
1 John CourseA Time1        0        1
2 John CourseA Time2        1        0
4 John CourseB Time2        1        0
3 John CourseB Time1        0        0
© www.soinside.com 2019 - 2024. All rights reserved.