Создать фрейм данных с отображением между двумя другими фреймами - PullRequest
0 голосов
/ 06 апреля 2020

Я пишу функцию для создания соответствия между коммитами и проблемами Jira. Не углубляясь в детали, он получает два фрейма данных - один, содержащий хэши фиксации и сообщения о коммитах, второй - проблемы Jira. Третий аргумент - это регулярное выражение, которое сообщает функции, как их отобразить.
Результатом должен быть фрейм данных с двумя столбцами - commit и issue, содержащий ha sh и ключ выдачи любого найденного отображения. Дубликаты (например, один и тот же ключ выпуска дважды) также должны быть перечислены.

Основываясь на этот вопрос , мне удалось сделать неправильный путь , используя вложенные циклы и Матрица логики, говорящая о том, существует ли отображение:

connect_commits_to_issues <- function(commit_data, issue_data, regex) {
    extracted <- commit_data %$% msg %>% str_extract_all(regex) %>% as.vector()
    map <- sapply(extracted, function(commit) {
        apply(issue_data, 1, function(r) any(r == commit))
    }) %>% t()

    result <- data.frame(commit = character(0), issue = character(0), stringsAsFactors = F)
    for (i in 1:nrow(commit_data)) {
        for (j in 1:nrow(issue_data)) {
            if (map[i, j]) {
                result[nrow(result) + 1,] <- list(commit = commit_data$commit[i],
                                                  issue = issue_data$key[j])
            }
        }
    }

    result
}

Пример использования:

library('tidyverse')
valid_jira_df <- data.frame(key = c("ISSUE-13", "ISSUE-169"),
                            stringsAsFactors = FALSE)
valid_commit_df <- data.frame(commit = c("A", "B", "C"),
                              msg = c("ISSUE-13 Fix", "new feature", "Another ISSUE-13 fix"),
                              stringsAsFactors = FALSE)
result <- connect_commits_to_issues(valid_commit_df, valid_jira_df, "(ISSUE-\\d+)")

str(result)
#'data.frame':  2 obs. of  2 variables:
#$ commit: chr  "A" "C"
#$ issue : chr  "ISSUE-13" "ISSUE-13"

Я знаю, что это решение очень не-Ri sh. Можно ли сделать это более умным (и векторизованным) образом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...