Извлечение строки из одного столбца в другой в R

#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