Вот вариант с использованием dplyr
и stringr
:
library(dplyr)
library(stringr)
data <-
tibble(test22 = c("Current SharePrice $6.57",
"Current NAV $7.11",
"Current Premium/Discount -7.59%",
"52WkAvg SharePrice $6.55",
"52WkAvg NAV $7.21",
"52WkAvg Premium/Discount -9.19%"),
Ticker = "MFM")
data %>%
mutate(category = str_replace(test22, "^(.+ .+) (.+)$", "\\1"),
price_pc = str_replace(test22, "^(.+ .+) (.+)$", "\\2"))
# A tibble: 6 x 4
test22 Ticker category price_pc
<chr> <chr> <chr> <chr>
1 Current SharePrice $6.57 MFM Current SharePrice $6.57
2 Current NAV $7.11 MFM Current NAV $7.11
3 Current Premium/Discount -7.59% MFM Current Premium/Discount -7.59%
4 52WkAvg SharePrice $6.55 MFM 52WkAvg SharePrice $6.55
5 52WkAvg NAV $7.21 MFM 52WkAvg NAV $7.21
6 52WkAvg Premium/Discount -9.19% MFM 52WkAvg Premium/Discount -9.19%
EDIT: объяснение используемого регулярного выражения
Игнорирование скобок на секунду:
^ = начало строки
. = любой символ, кроме новой строки
+ = хотя бы один из предыдущих символов (в данном случае любой символ, кроме новой строки)
$ = конец строки
Итак, "^(.+ .+) (.+)$"
ищет строки, которые начинаются, имеют несколько символов, затем пробел, затем несколько символов, затем пробел, затем еще несколько символов, затем конец.
Скобки добавляются как «группы захвата», что означает, что запрос «запоминает» ту часть строки, которая представлена этими скобками, и может быть извлечена путем обращения к порядку скобок. Следовательно, "\\1"
возвращает то, что было захвачено первой скобкой, а "\\2"
возвращает то, что было захвачено второй.
Хорошим ресурсом для изучения Regex является Regexr .