【问题标题】:Combining the results of nested `tar_map` calls结合嵌套 `tar_map` 调用的结果
【发布时间】:2021-07-15 22:18:48
【问题描述】:

我正在创建一个允许放入任意数量的数据集名称的管道,它们都将经过类似的清理过程。为此,我使用了targets 包,并使用tarchetypes 中的tar_map 函数,我对每个数据集进行了一系列整理和整理函数。

我现在的问题是,一个数据集需要按一个因子拆分为三个数据集(例如 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 对象。

感谢任何帮助 - 如果需要进一步说明,请告诉我。

【问题讨论】:

    标签: r target targets-r-package


    【解决方案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)
      )
    )
    

    【讨论】:

    • 谢谢朗道博士。实验室决定暂时采用不同的分析策略,因此我尚未实施您的解决方案 - 但我想我会及时返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多