Объединение результатов вложенных вызовов tar_map

Я создаю конвейер, который позволяет вводить произвольное количество имен наборов данных, где все они будут проходить через аналогичные процессы очистки. Для этого я использую targetsпакет и с помощью tar_mapфункция от tarchetypes, я подвергаю каждый набор данных ряду функций очистки и обработки.

Теперь моя проблема заключается в том, что один набор данных необходимо разделить на три набора данных с коэффициентом (а-ля split), а остальные должны оставаться нетронутыми. Затем конвейер теоретически будет двигаться дальше, обрабатывая каждый набор данных по отдельности, включая три «дочерних» набора данных.

Вот моя лучшая попытка:

      library(targets)
library(tarchetypes)
library(tidyverse)

# dir.create("./data")
# tibble(nums = 1:300, groups = rep(letters[1:3], each = 100)) |> 
#   write_csv("./data/td1.csv")
# tibble(nums = 301:600, groups = rep(letters[1:3], each = 100)) |> 
#   write_csv("./data/td2.csv")
# tibble(nums = 601:900, groups = rep(letters[1:3], each = 100)) |> 
#   write_csv("./data/td3.csv")

tar_option_set(
  packages = c("tidyverse")
)

read_data <- function(paths) {
  read_csv(paths)
}

get_group <- function(data, groups) {
  filter(data, groups == groups)
}

do_nothing <- function(data) {
  data
}

list(
  map1 <- tar_map(
    values = tibble(datasets = c("./data/td1.csv", "./data/td2.csv", "./data/td3.csv")),
    tar_target(data, read_data(datasets)),
    map2 <- tar_map(values = tibble(groups = c("a", "b", "c")),
            tar_skip(tester, get_group(data, groups), !str_detect(tar_name(), "td3\\.csv$"))
    ),
    tar_target(dn, do_nothing(list(data, tester)))
  )
)

Метод пропуска немного неуклюжий, я, возможно, тоже думаю об этом неправильно.

Я, очевидно, пытаюсь плохо комбинировать код в конце, помещая их в список, но я не знаю, что еще делать.

Наборы данных не могут быть объединены, скажем, rbind, так как на самом деле они SummarizedExperimentобъекты.

Любая помощь приветствуется - дайте мне знать, если нужны какие-либо дополнительные разъяснения.

1 ответ

Если вы заранее знаете уровни этого фактора, вы можете справиться с разделением этого третьего набора данных с помощью отдельного tar_map()вызов похож на то, что вы делаете сейчас. Если вы заранее не знаете уровни факторов, то разделение необходимо обрабатывать с помощью динамического ветвления, и я рекомендую что-то вроде tarchetypes::tar_group_by().

я так не думаю tar_skip()здесь имеет значение, и я рекомендую удалить его.

Если вы начинаете с физических файлов (или пишете физические файлы), я настоятельно рекомендую вам отслеживать их с помощью format = "file": https://books.ropensci.org/targets/files.html#external-input-files.

      library(targets)
library(tarchetypes)
tar_option_set(packages = "tidyverse")

list(
  tar_map(
    values = list(paths = c("data/td1.csv", "data/td2.csv")),
    tar_target(file, paths, format = "file"),
    tar_target(data, read_csv(file, col_types = cols()))
  ),
  tar_target(file3, "data/td3.csv", format = "file"),
  tar_group_by(data3, read_csv(file3, col_types = cols()), groups),
  tar_target(
    data3_row_counts,
    tibble(group = data3$groups[1], n = nrow(data3)),
    pattern = map(data3)
  )
)
Другие вопросы по тегам