将多个函数映射到R中字符串向量的最有效方法是什么?

将多个函数映射到R中字符串向量的最有效方法是什么?,r,performance,purrr,R,Performance,Purrr,我有一个文件名列表,它们位于同一子目录中,跨越几个不同的文件扩展名。我的目标是提取每个文件名,而不提取其完整路径和扩展名,我可以通过以下方式成功地做到这一点: req_libraries <- c("dplyr", "purrr", "stringr") lapply(req_libraries, require, character.only = TRUE) file_list <- c("dir/folder

我有一个文件名列表,它们位于同一子目录中,跨越几个不同的文件扩展名。我的目标是提取每个文件名,而不提取其完整路径和扩展名,我可以通过以下方式成功地做到这一点:

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
req\u库%
映射(~str\u split(.x,pattern=“\\”[[1]][1])%>%
映射(~trimws(.x,which=“both”))%>%
取消列表()%>%
tibble()
目标名称
这是适合的目的,但我很好奇如何才能最好地简化我的功能链。我相信有一种简单的方法可以实现这一点,也许可以使用与
map_*()
集合不同的功能,但我并没有取得太大的成功

谢谢


编辑:你们中的一些人提出了一些非常有用的建议,包括一次性完成所有这些步骤,而且效果很好。但是,如果在另一个场景中,我必须将一系列函数映射到同一个向量,那么最好的方法是什么?

如果在
gsub
中使用捕获组,则这是一条直线:

tibble(files = trimws(gsub("^.*/(.*)[.].*$", "\\1", file_list)))
#> # A tibble: 3 x 1
#>   files 
#>  <chr> 
#> 1 city_a
#> 2 city_b
#> 3 city_c
tibble(files=trimws(gsub(“^.*/(.*)[.].*$”,“\\1”,文件列表)))
#>#tibble:3 x 1
#>档案
#>   
#>1城市a
#>2城市b
#>3城市大学c
正则表达式分解如下:

  • ^.*/
    表示“匹配从字符串开头到最后一个前斜杠的任何内容”
  • (.*)[.]
    表示“现在捕获任何内容,直到最后一段时间”
  • *$
    表示“在字符串结束前匹配任何其他内容”

您可以使用
basename
仅获取文件名,使用
file\u path\u sans\u ext
无扩展名获取文件名

trimws(tools::file_path_sans_ext(basename(file_list)))
#[1] "city_a" "city_b" "city_c"
或将其保留在底部R:

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

谢谢你,艾伦!这真的很有帮助-我有时觉得正则表达式有点视觉冲击,但你已经很好地分解了它。假设我忠于将多个函数映射到我的列表的方法,如问题中所述,有没有一种方法可以更有效地进行一系列映射?谢谢Ronak!这真的很有用-我没听说过basename或file_path_sans_ext,但它们肯定会派上用场。。假设我忠实于将多个函数映射到我的列表的方法,如问题中所述,您知道是否有一种方法可以更有效地进行一系列映射吗?@SamB您想为此使用管道吗?如果是这样的话,您可以使用
文件列表%>%basename()%%>%tools::file\u path\u sans\u ext()%%>%trimws
。再次感谢您!