#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:
- Ваша функция
string_flip
не векторизована. Это работает только для одной строки за раз. - Я думаю, у вас есть дополнительные
x
, поэтому строка удваивается. - В
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"