#r #regex #stringr
Вопрос:
У меня есть пример фрейма данных, подобный приведенному ниже.
ID | Файл |
---|---|
1 | 11_213.csv |
2 | 13_256.csv |
3 | 11_223.csv |
4 | 12_389.csv |
5 | 14_456.csv |
6 | 12_345.csv |
И я хочу добавить еще один столбец, основанный на строке между подчеркиванием и точкой, чтобы получить фрейм данных, который выглядит примерно так.
ID | Файл | Группа |
---|---|---|
1 | 11_213.csv | 213 |
2 | 13_256.csv | 256 |
3 | 11_223.csv | 223 |
4 | 12_389.csv | 389 |
5 | 14_456.csv | 456 |
6 | 12_345.csv | 345 |
Я думаю, что мне нужно использовать функцию str_extract в stringr, но я не уверен, какую нотацию использовать для моего шаблона. Например, когда я использую:
df <- df %>%
mutate("Group" = str_extract(File, "[^_] "))
Я получаю всю информацию перед подчеркиванием, как это:
ID | Файл | Группа |
---|---|---|
1 | 11_213.csv | 11 |
2 | 13_256.csv | 13 |
3 | 11_223.csv | 11 |
4 | 12_389.csv | 12 |
5 | 14_456.csv | 14 |
6 | 12_345.csv | 12 |
Но это не то, чего я хочу. Что я должен использовать вместо » [ ^ _ ] «, чтобы получить только то, что находится между подчеркиванием и точкой? Спасибо!
Комментарии:
1. Тебе нужно
str_extract(File, "(?<=_)(\d )(?=\.)")
Ответ №1:
Мы можем использовать поиск по регулярному выражению для извлечения цифр ( \d
), которые следуют за a _
и предшествуют a .
с str_extract
library(dplyr)
library(stringr)
df <- df %>%
mutate(Group = str_extract(File, "(?<=_)(\d )(?=\.)")
Или другой вариант — удалить подстроку str_remove
, т. е. сопоставить символы ( .*
), включая символы _
или ( |
) .
, начиная с ( .
может совпадать с любым символом в режиме регулярного выражения, что по умолчанию, поэтому мы экранируем \
его для буквального сопоставления)
df <- df %>%
mutate(Group = str_remove_all(File, ".*_|\..*"))
Ответ №2:
Базовый вариант R с использованием gsub
transform(
df,
Group = gsub(".*_(\d )\..*", "\1", File)
)
дает
ID File Group
1 1 11_213.csv 213
2 2 13_256.csv 256
3 3 11_223.csv 223
4 4 12_389.csv 389
5 5 14_456.csv 456
6 6 12_345.csv 345