Вот вариант с использованием 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.
person
g_t_m
schedule
15.01.2019