首页 > 解决方案 > 从课程列表中查找当前活动条目

问题描述

我需要从课程列表中找到“当前”等效课程。该列表的格式相当简单,来自 SQL 查询,如下所示:

课程代码 课程名称 Course_Status 家长课程
HLT31802 标题1a 被取代 HLT31807
HLT31807 标题1b 被取代 HLT31812
HLT31812 标题1c 被取代 HLT35015
HLT35015 标题1d 被取代 HLT35021
HLT35021 标题1e 当前的 没有任何
ABC12345 标题2a 被取代 ABC67890
ABC67890 标题2b 当前的 没有任何

我确信解决方案与递归有关,但我无法理解它。我很高兴发布我尝试过的代码,但如果没有在 SQL 中创建多个列(child1、child2 等),我并没有走得太远。

所需的输出将是这样的:

课程代码 Current_Course
HLT31802 HLT35021
HLT31807 HLT35021
HLT31812 HLT35021
HLT35015 HLT35021
HLT35021 HLT35021
ABC12345 ABC67890
ABC67890 ABC67890

任何帮助,将不胜感激!

标签: rdataframerecursionparent-childigraph

解决方案


如果您不想使用course_title列,您也可以这样做。

  • 用于igraph为每个parent-child.
  • 此后values在我们的案例中使用该集群 ID,用于 group_by 实际数据。
  • 为了执行网络分析,parent-child我还必须None从父级中删除并在找到 a 时将其替换为子级本身None

希望其他语法很清楚。其他要求解释

df <- read.table(header = T, text = 'Course_Code    Course_Title    Course_Status   Parent_Course
HLT31802    Title1a Superseded  HLT31807
HLT31807    Title1b Superseded  HLT31812
HLT31812    Title1c Superseded  HLT35015
HLT35015    Title1d Superseded  HLT35021
HLT35021    Title1e Current None
ABC12345    Title2a Superseded  ABC67890
ABC67890    Title2b Current None')

library(tidyverse)
library(igraph)

df %>%
  mutate(Parent_Course = ifelse(Parent_Course == 'None', Course_Code, Parent_Course)) %>%
  select(1,4) %>%
  graph.data.frame() %>%
  components() %>%
  pluck(membership) %>%
  stack() %>%
  right_join(df, by = c('ind' = 'Course_Code')) %>%
  group_by(values) %>%
  mutate(Parent_Course = ind[Course_Status == 'Current'], .keep = 'used') %>%
  rename(Course_Code = ind)

#> # A tibble: 7 x 4
#> # Groups:   values [2]
#>   values Course_Code Course_Status Parent_Course
#>    <dbl> <chr>       <chr>         <chr>        
#> 1      1 HLT31802    Superseded    HLT35021     
#> 2      1 HLT31807    Superseded    HLT35021     
#> 3      1 HLT31812    Superseded    HLT35021     
#> 4      1 HLT35015    Superseded    HLT35021     
#> 5      1 HLT35021    Current       HLT35021     
#> 6      2 ABC12345    Superseded    ABC67890     
#> 7      2 ABC67890    Current       ABC67890

reprex 包于 2021-06-30 创建 (v2.0.0 )


推荐阅读