从课程列表中查找当前活动条目
Finding current active entry from a list of courses
我需要从课程列表中找到 'current' 等效课程。该列表的格式相当简单,来自 SQL 查询,如下所示:
Course_Code
Course_Title
Course_Status
Parent_Course
HLT31802
Title1a
已取代
HLT31807
HLT31807
Title1b
已取代
HLT31812
HLT31812
Title1c
已取代
HLT35015
HLT35015
Title1d
已取代
HLT35021
HLT35021
Title1e
当前
None
ABC12345
Title2a
已取代
ABC67890
ABC67890
Title2b
当前
None
我确定解决方案与递归有关,但我无法理解它。我很高兴 post 我试过的代码,但如果没有在 SQL.
中创建多个列(child1、child2 等),我就没有走得太远
要求的输出是这样的:
Course_Code
Current_Course
HLT31802
HLT35021
HLT31807
HLT35021
HLT31812
HLT35021
HLT35015
HLT35021
HLT35021
HLT35021
ABC12345
ABC67890
ABC67890
ABC67890
如有任何帮助,我们将不胜感激!
通过使用包 stringr
和 dplyr
:
df <- data %>%
filter(Course_Status == "Current") %>%
mutate(Ety = str_sub(Course_Code, 1, 3)) %>%
select(-Course_Status) %>%
rename(Current_Course = Course_Code)
df2 <- data %>%
select(Course_Code) %>%
mutate(Ety = str_sub(Course_Code, 1, 3))
res <- left_join(df2, df, by = "Ety")
res <- res %>%
select(-Ety)
res
如果您不想使用 course_title
列,您也可以这样做。
- 使用
igraph
为每个 parent-child
创建了一个单独的集群。
- 此后在我们的例子中使用了 cluster-id
values
,group_by 用于实际数据。
- 为了对
parent-child
进行网络分析,我还必须从父项中删除 None
,并在发现 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 package (v2.0.0)
于 2021-06-30 创建
另一个igraph
选项
df %>%
mutate(Parent_Course = ifelse(Parent_Course == "None", Course_Code, Parent_Course)) %>%
select(Course_Code, Parent_Course, everything()) %>%
group_by(Grp = membership(components(graph_from_data_frame(.)))[Course_Code]) %>%
mutate(Parent_Course = Parent_Course[Course_Status == "Current"]) %>%
ungroup()
给予
Course_Code Parent_Course Course_Title Course_Status Grp
<chr> <chr> <chr> <chr> <dbl>
1 HLT31802 HLT35021 Title1a Superseded 1
2 HLT31807 HLT35021 Title1b Superseded 1
3 HLT31812 HLT35021 Title1c Superseded 1
4 HLT35015 HLT35021 Title1d Superseded 1
5 HLT35021 HLT35021 Title1e Current 1
6 ABC12345 ABC67890 Title2a Superseded 2
7 ABC67890 ABC67890 Title2b Current 2
我需要从课程列表中找到 'current' 等效课程。该列表的格式相当简单,来自 SQL 查询,如下所示:
Course_Code | Course_Title | Course_Status | Parent_Course |
---|---|---|---|
HLT31802 | Title1a | 已取代 | HLT31807 |
HLT31807 | Title1b | 已取代 | HLT31812 |
HLT31812 | Title1c | 已取代 | HLT35015 |
HLT35015 | Title1d | 已取代 | HLT35021 |
HLT35021 | Title1e | 当前 | None |
ABC12345 | Title2a | 已取代 | ABC67890 |
ABC67890 | Title2b | 当前 | None |
我确定解决方案与递归有关,但我无法理解它。我很高兴 post 我试过的代码,但如果没有在 SQL.
中创建多个列(child1、child2 等),我就没有走得太远要求的输出是这样的:
Course_Code | Current_Course |
---|---|
HLT31802 | HLT35021 |
HLT31807 | HLT35021 |
HLT31812 | HLT35021 |
HLT35015 | HLT35021 |
HLT35021 | HLT35021 |
ABC12345 | ABC67890 |
ABC67890 | ABC67890 |
如有任何帮助,我们将不胜感激!
通过使用包 stringr
和 dplyr
:
df <- data %>%
filter(Course_Status == "Current") %>%
mutate(Ety = str_sub(Course_Code, 1, 3)) %>%
select(-Course_Status) %>%
rename(Current_Course = Course_Code)
df2 <- data %>%
select(Course_Code) %>%
mutate(Ety = str_sub(Course_Code, 1, 3))
res <- left_join(df2, df, by = "Ety")
res <- res %>%
select(-Ety)
res
如果您不想使用 course_title
列,您也可以这样做。
- 使用
igraph
为每个parent-child
创建了一个单独的集群。 - 此后在我们的例子中使用了 cluster-id
values
,group_by 用于实际数据。 - 为了对
parent-child
进行网络分析,我还必须从父项中删除None
,并在发现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 package (v2.0.0)
于 2021-06-30 创建另一个igraph
选项
df %>%
mutate(Parent_Course = ifelse(Parent_Course == "None", Course_Code, Parent_Course)) %>%
select(Course_Code, Parent_Course, everything()) %>%
group_by(Grp = membership(components(graph_from_data_frame(.)))[Course_Code]) %>%
mutate(Parent_Course = Parent_Course[Course_Status == "Current"]) %>%
ungroup()
给予
Course_Code Parent_Course Course_Title Course_Status Grp
<chr> <chr> <chr> <chr> <dbl>
1 HLT31802 HLT35021 Title1a Superseded 1
2 HLT31807 HLT35021 Title1b Superseded 1
3 HLT31812 HLT35021 Title1c Superseded 1
4 HLT35015 HLT35021 Title1d Superseded 1
5 HLT35021 HLT35021 Title1e Current 1
6 ABC12345 ABC67890 Title2a Superseded 2
7 ABC67890 ABC67890 Title2b Current 2