[英]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.