簡體   English   中英

R purrr::map() & mutate():根據列表中的變量添加許多新列

[英]R purrr::map() & mutate(): Add many new columns based on variables in list

我需要創建一個數據框來總結與文件檢查相關的信息。

我有一份氣候情景和年份的 126 種獨特組合的列表(例如“ssp126_2030”、“ssp126_2050”、“ssp145_2030”、“ssp245_2050”)。 這些獨特的元件代表一個較大的完整文件路徑指示的部分,以一個特定的文件(scenario_list,下文)。 對於每個唯一元素,我需要創建多個新列,指定文件是否存在、文件大小和創建日期。

我想遍歷 126 個元素的列表並將文件檢查表( file_check_table ,如下)拼接在一起。 我從一個子目錄表開始,然后將這些字符串拆分為多個部分,以便我可以將一個字符串粘貼到一起,該字符串指向我要檢查的子目錄中的文件。 我的目標是使用mutate()/ transmutate ()purrr::map()循環遍歷氣候場景列表中的每個元素並添加多個文件檢查列(見下表)。

我是函數式編程的新手,這是我迄今為止嘗試過的方法,我正在考慮創建一個函數來添加新列,然后將該函數應用於氣候場景列表。 我的最終目標是為每個氣候場景和文件檢查類型創建一個新列:

file_checks <- function(x) {
                       dir_list %>%
                       mutate(file_check_table,!!paste0(new_col_name) := ifelse(file.exists(paste0(file))==TRUE,1,0))}

file_check_table <- map(scenario_list, file_checks(x))

但是,這個函數不起作用,因為我認為我沒有正確地編寫函數或者正確地使用了 purrr。 任何有關如何解決此問題的想法將不勝感激,謝謝。 這就是我想要的file_check_table

示例文件檢查表

如果我正確理解了您的問題,那么您有一個描述文件路徑的scenario_list ,並希望了解文件的特征。 這樣做的自然方法是運行一個每行一個條目的管道,沒有理由將它放在函數中。

例如:

library(tidyverse)

scenario_list <- read_lines("scenario_list.txt")
root_dir <- "C:/USers/Documents/my_project/data_subdir"

file_table <- tibble(scenario = scenario_list) %>%
  mutate(path = file.path(root_dir, paste0(scenario, ".csv")),
         exists = file.exists(path),
         full_info = file.info(path),
         file_size = full_info$size,
         file_date = full_info$mtime)

然后,如果您希望在屏幕截圖中的單行上輸出:

file_table %>%
  select(-path, -full_info) %>%
  pivot_wider(names_from = scenario,
              names_glue = "{scenario}_{.value}",
              values_from = !scenario) %>%
  write_csv("output.csv")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM