Как перемещать шаблоны в строке в r?

#r #string #data-manipulation #stringr

#r #строка #манипулирование данными #stringr

Вопрос:

Я пытаюсь закодировать функцию, которая позволила бы мне перемещать определенные шаблоны в строке в r. Например, если моими строками являются pattern_string1, pattern_string2, pattern_string3, pattern_string4, я хочу изменить их на string1_pattern, string2_pattern, string3_pattern, string4_pattern .

Чтобы добиться этого, я попробовал следующее:

 string_flip <- function(x, pattern){
  if(str_detect(x, pattern)==TRUE){
    str_remove(x, pattern) %>%
    paste(x, "pattern", sep = "_")
  }
}
 

Однако, когда я пытаюсь применить это к вектору строк с помощью следующего кода:

 stringvector <- c(pattern_string1, pattern_string2, pattern_string3, pattern_string4, string5, string6)
string_flip(stringvector, "pattern")
 

он возвращает предупреждение и изменяет все векторы, а не только векторы, содержащие «шаблон». Кроме того, он не только добавляет шаблон в конец строки, но и удваивает саму строку, поэтому я получаю следующий результат:

 [1] "_string1_pattern_string1_pattern" "_string2_pattern_string2_pattern" "_string3_pattern_string3_pattern"
[4] "_string4_pattern_string4_pattern" "string5_string5_pattern"                "string6_string6_pattern"  
 

Кто-нибудь может мне помочь с этим?
Заранее большое спасибо!

Ответ №1:

  1. Ваша функция string_flip не векторизована. Это работает только для одной строки за раз.
  2. Я думаю, у вас есть дополнительные x , поэтому строка удваивается.
  3. В paste , pattern не должно быть в кавычках.

Попробуйте эту функцию.

 library(stringr)


string_flip <- function(x, pattern){
  trimws(ifelse(str_detect(x, pattern), 
     str_remove(x, pattern) %>% paste(pattern, sep = "_"), x), whitespace = '_')
}


stringvector <- c('pattern_string1', 'pattern_string2', 'pattern_string3', 'pattern_string4')
string_flip(stringvector, "pattern")

#[1] "string1_pattern" "string2_pattern" "string3_pattern" "string4_pattern"