簡體   English   中英

將多個函數映射到 R 中的字符串向量的最有效方法是什么?

[英]What is the most efficient way of mapping multiple functions to a vector of strings in R?

我有一個文件名列表,它們位於同一子目錄中,跨越幾個不同的文件擴展名。 我的目標是在沒有完整路徑和擴展名的情況下提取每個文件名,我可以通過以下方式成功完成:

req_libraries <- c("dplyr", "purrr", "stringr")
lapply(req_libraries, require, character.only = TRUE)

file_list <- c("dir/folder/city_a.csv",
               "dir/folder/ city_b.xlsx",
               "dir/folder/city_c .csv")

target_names <- file_list %>%
  map(~ str_split(.x, pattern = "/")[[1]]) %>%
  map(~ tail(.x, 1)) %>%
  map(~ str_split(.x, pattern = "\\.")[[1]][1]) %>%
  map(~ trimws(.x, which = "both")) %>%
  unlist() %>%
  tibble()

target_names

這是符合目的的,但我很好奇如何最好地簡化我的功能鏈。 我相信有一種簡單的方法可以實現這一點,也許可以使用map_*()集合中的不同 function ,但我沒有取得太大的成功。

謝謝!

編輯:你們中的一些人提出了一些非常有用的建議,涉及在一個 go 中執行所有這些步驟,並且它們運行良好。 但是,如果在另一種情況下我不得不將 map 一系列函數轉換為同一個向量,那么最好的方法是什么?

您可以使用basename僅獲取文件名,使用file_path_sans_ext獲取不帶擴展名的文件。

trimws(tools::file_path_sans_ext(basename(file_list)))
#[1] "city_a" "city_b" "city_c"

或者將其保存在基礎 R 中:

trimws(sub('\\..*', '', basename(file_list)))

如果您在gsub中使用捕獲組,這是一個單行:

tibble(files = trimws(gsub("^.*/(.*)[.].*$", "\\1", file_list)))
#> # A tibble: 3 x 1
#>   files 
#>  <chr> 
#> 1 city_a
#> 2 city_b
#> 3 city_c

正則表達式分解如下:

  • ^.*/表示“匹配從字符串開頭到最后一個正斜杠的任何內容”
  • (.*)[.]表示“現在捕獲任何東西,直到最后一個時期”
  • .*$表示“匹配任何其他內容,直到字符串結尾”

暫無
暫無

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

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