1

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

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

任何帮助表示赞赏 - 如果需要进一步澄清,请告诉我。

4

1 回答 1

2

如果您事先知道该因素的水平,则可以使用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)
  )
)
于 2021-07-16T12:30:52.433 回答