Добавьте пробел между числом и условием специального символа R

Я пытаюсь использовать базовые вызовы stringr или R для условного добавления пробела для экземпляров в большом векторе, где есть числовое значение, а затем специальный символ - в этом случае знак $ без пробела. str_pad, по-видимому, не допускает опорные векторы.

Например, для:

$ 6,88$7,34

Я хотел бы добавить пробел после последнего числа и перед следующим знаком доллара:

6,88$7,34

Спасибо!

2 ответа

Решение

Это будет работать, если вы работаете с векторной строкой:

mystring<-as.vector('$6.88$7.34 $8.34$4.31')

gsub("(?<=\\d)\\$", " $", mystring, perl=T)

[1] "$6.88 $7.34 $8.34 $4.31"

Это включает в себя случаи, когда уже есть место.

По поводу вопроса, заданного в комментариях:

mystring2<-as.vector('Regular_Distribution_Type† Income Only" "Distribution_Rate 5.34%" "Distribution_Amount $0.0295" "Distribution_Frequency Monthly')

gsub("(?<=[[:alpha:]])\\s(?=[[:alpha:]]+)", "_", mystring2, perl=T)

[1] "Regular_Distribution_Type<U+2020> Income_Only\" \"Distribution_Rate 5.34%\" \"Distribution_Amount $0.0295\" \"Distribution_Frequency_Monthly"

Обратите внимание, что \ появляется из-за вложенных кавычек в векторе, не должно иметь никакого значения. Также <U+2020> появляется из-за кодирования специального символа.

Объяснение регулярного выражения:

(?<=[[:alpha:]]) Эта первая часть - позитивный взгляд, созданный ?<=в основном это выглядит позади всего, что мы пытаемся сопоставить, чтобы убедиться, что то, что мы определяем в обзоре, есть. В этом случае мы ищем [[:alpha:]] который соответствует буквенному символу.

Затем мы проверяем пустое пространство с \sв R мы должны использовать двойной выход, так \\sэто то, что мы пытаемся соответствовать.

Наконец мы используем (?=[[:alpha:]]+), который является положительным прогнозом, определяемым ?= это проверяет, чтобы убедиться, что наше совпадение сопровождается другой буквой, как описано выше.

Логика состоит в том, чтобы найти пробел между буквами и сопоставить пробел, который затем заменяется gsub, с _

Посмотреть все регулярные выражения здесь

Если есть только один экземпляр, используйте sub захватить цифру и $ отдельно и при замене добавить пробел между обратными ссылками захваченной группы

sub("([0-9])([$])", "\\1 \\2", v1)
#[1] "$6.88 $7.34"

Или с регулярным выражением

gsub("(?<=[0-9])(?=[$])", " ", v1, perl = TRUE)

данные

v1 <- "$6.88$7.34"
Другие вопросы по тегам