Каков наиболее эффективный способ сопоставления нескольких функций вектору строк в R? - PullRequest
2 голосов
/ 20 июня 2020

У меня есть список имен файлов, которые находятся в одном подкаталоге и охватывают несколько разных расширений файлов. Моя цель - извлечь каждое из имен файлов без их полных путей и без их расширений, что я могу успешно сделать следующим образом:

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_*(), но я не добился большого успеха.

Спасибо!

EDIT : некоторые из вас сделали несколько действительно полезных предложений, связанных с выполнением всех этих шагов за один go, и они работают хорошо. Но если в другом сценарии у меня было для сопоставления серии функций с одним и тем же вектором, как лучше всего это сделать?

Ответы [ 2 ]

4 голосов
/ 20 июня 2020

Вы можете использовать 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)))
3 голосов
/ 20 июня 2020

Если вы используете группу захвата в gsub, это однострочный:

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

Регулярное выражение разбивается следующим образом:

  • ^.*/ Означает «сопоставить что-либо от начала строки до последнего переднего sla sh»
  • (.*)[.] означает «теперь захватить что-либо до последнего периода»
  • .*$ означает «сопоставить что угодно иначе до конца строки "
...