Извлечь все, кроме в stringr - PullRequest
0 голосов
/ 02 июля 2018

У меня есть список следующих файлов

a_file.csv another_file.csv a_third_file.csv

Я хотел бы написать функцию, которая будет paste только текстом до _file.csv, поэтому приведенные выше строки будут.

a another a_third

как я могу сделать это с stringr?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Только потому, что вы явно спросили, вот решение str_extract_all(). Вам нужно использовать так называемый « позитивный взгляд ».

library(stringr)

x <- c("a_file.csv", "another_file.csv", "a_third_file.csv")

str_extract_all(x, regex(".*(?=_file.csv)"))
#> [[1]]
#> [1] "a" "" 
#> 
#> [[2]]
#> [1] "another" ""       
#> 
#> [[3]]
#> [1] "a_third" ""

@ Ответ Джоэла, т. Е. str_split, конечно, более лаконичен и быстрее. Я использую fixed() здесь, так как мы сопоставляем фиксированную строку, а не регулярное выражение.

str_split(x, fixed("_file.csv"))
#> [[1]]
#> [1] "a" "" 
#> 
#> [[2]]
#> [1] "another" ""       
#> 
#> [[3]]
#> [1] "a_third" ""

base R или, точнее, utils::strsplit(), может, конечно, делать то же самое, но обратите внимание, что пустые строки пропали.

strsplit(x, "_file.csv", fixed = TRUE)
#> [[1]]
#> [1] "a"
#> 
#> [[2]]
#> [1] "another"
#> 
#> [[3]]
#> [1] "a_third"

Единственный символьный вектор в качестве возвращаемого значения еще более сжат, ИМО. Три альтернативы:

  1. str_extract() с положительным прогнозом.
str_extract(x, regex(".*(?=_file.csv)"))
#> [1] "a"       "another" "a_third"
  1. Вместо того, чтобы извлечь нужные строки, вы также можете заменить / удалить ненужные строки.
str_replace(x, fixed("_file.csv"), "")
#> [1] "a"       "another" "a_third"
  1. Та же стратегия с base::gsub()
gsub("_file.csv", "", x, fixed = TRUE)
#> [1] "a"       "another" "a_third"
0 голосов
/ 02 июля 2018

Вы можете использовать str_split:

str_split("a_file.csv", "_file.csv")

Это вернет список частей, основанных на шаблоне "_file.csv". Документация

...