1

我开始将 {drake} 用于数据生产管道。我使用的原始数据非常大,分为大约 130 个单独的(Stata)文件。因此,每个文件都应该单独处理。为了保持可读性,我使用target(),transform()map()指定我的计划。这看起来类似于下面的代码:

plan <- drake_plan(
    dta_paths = list.files(my_folder, full.names = TRUE),
    dfs = target(
        read.dta13(dta_path),
        transform = map(dta_path = dta_paths)
    )
)

所以当我make()计划时,我收到以下错误:

目标 dfs_dta_paths

警告:目标 dfs_dta_paths 警告:

条件的长度 > 1 并且只使用第一个元素

条件的长度 > 1 并且只使用第一个元素

条件的长度 > 1 并且只使用第一个元素

dfs_dta_paths 失败

错误:目标dfs_dta_paths失败。来电询问diagnose(dfs_dta_paths)详情。错误信息:

期望单个字符串值:[type=character; 范围=129]。

根据我从这个警告和错误消息中了解到的情况,不同文件路径的映射不起作用,完整的向量被传递给第一个函数调用。我阅读了https://books.ropensci.org/drake/static.html#map但它无助于解决问题。将路径向量转换为列表也无济于事。

如何在不组合数据集的情况下将多个德雷克目标组合成一个交叉目标?我得到了预定义网格的想法,它实际上按建议工作。但是因为我只需要一个向量,而不是一个复杂的网格,这对我来说看起来像是过度设计。

我觉得我错过了一些明显的东西,但我无法发现它。任何想法我的代码有什么问题?


我知道https://books.ropensci.org/drake/plans.html#how-to-choose-good-targets,但由于我想在数据清理过程中进行迭代,我认为这会有所帮助dfs如上所示创建目标。

4

1 回答 1

2

使用时target(transform = ...),最好先将计划可视化,然后再将其提供给make()。可能需要几次迭代才能使其正确。这是您当前的计划的样子。

library(drake)
plan <- drake_plan(
  dta_paths = list.files(my_folder, full.names = TRUE),
  dfs = target(
    read.dta13(dta_path),
    transform = map(dta_path = dta_paths)
  )
)

plan
#> # A tibble: 2 x 2
#>   target        command                                 
#>   <chr>         <expr>                                  
#> 1 dta_paths     list.files(my_folder, full.names = TRUE)
#> 2 dfs_dta_paths read.dta13(dta_paths)

config <- drake_config(plan)
vis_drake_graph(config)

reprex 包于 2020-01-16 创建(v0.3.0)

要为每个目标读取一个文件,我推荐以下计划。有关它为何使用!!.

library(drake)

# create some faux stata files for the example.
my_folder <- fs::dir_create("folder")
file.create("folder/file1.dta")
#> [1] TRUE
file.create("folder/file2.dta")
#> [1] TRUE

# Since you are using static branching (https://books.ropensci.org/drake/static.html)
# this needs to be defined up front.
# It does not need to be a target, re https://books.ropensci.org/drake/plans.html#how-to-choose-good-targets
dta_paths <- list.files(my_folder, full.names = TRUE)

plan <- drake_plan(
  dfs = target(
    # Use !! here to literally insert the path so file_out() can mark it for tracking.
    read.dta13(file_in(!!dta_path)),
    # Use !! here to insert the actual vector of paths instead of the symbol `dta_paths`
    transform = map(dta_path = !!dta_paths)
  )
)

plan
#> # A tibble: 2 x 2
#>   target               command                                
#>   <chr>                <expr>                                 
#> 1 dfs_folder.file1.dta read.dta13(file_in("folder/file1.dta"))
#> 2 dfs_folder.file2.dta read.dta13(file_in("folder/file2.dta"))

config <- drake_config(plan)
vis_drake_graph(config)

reprex 包于 2020-01-16 创建(v0.3.0)

于 2020-01-16T20:57:51.320 回答