Извлечь число между подчеркиванием в тексте - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть файлы с именами, такими как

  • Hughson.George_54_4
  • Ifran.Dean_51_3
  • Хьюстон. Аманда_49_6

I 'Я хотел бы создать фрейм данных, в котором каждая строка представляет собой информацию, извлеченную из имени файла в форме Автор, Том, Проблема.

Я могу извлечь имя и том, но, похоже, не могуполучить номер вопроса.Используя пакет "stringr", я сделал следующее, что дает мне _4 вместо 4.

[^a-z](?:[^_]+_){0}([^_ ]+$)  

Как мне это исправить?

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

вы ищете:

read.table(text = string, sep ='_', col.names = c('Author', 'Volume', 'Issue'))

          Author Volume Issue
1 Hughson.George     54     4
2     Ifran.Dean     51     3
3 Houston.Amanda     49     6

где

string <- c("Hughson.George_54_4", "Ifran.Dean_51_3", "Houston.Amanda_49_6")

редактировать: Вы ищете:

 read.table(text = string, sep ='_', fill=TRUE)
0 голосов
/ 13 сентября 2018

Часть [^a-z] вашего регулярного выражения совпадает с _, предшествующим последней цифре.Просто используйте что-то, чтобы соответствовать только цифрам в конце:

x1 <- c("Hughson.George_54_4", "Ifran.Dean_51_3", "Houston.Amanda_49_6")

str_extract(x1,"([^_]+$)")
[1] "4" "3" "6"

str_extract(x1,"\\d+$")
[1] "4" "3" "6"

Ваша общая цель выглядит как работа для strsplit, хотя:

data.frame(do.call("rbind",strsplit(sub("\\."," ",x1),"_")))
              X1 X2 X3
1 Hughson George 54  4
2     Ifran Dean 51  3
3 Houston Amanda 49  6
0 голосов
/ 13 сентября 2018

Если это последняя цифра, мы можем просто использовать base R методы для ее извлечения

as.numeric(substring(str1, nchar(str1)))

Или с sub

as.numeric(sub(".*_", "", str1))
#[1] 4 3 6

Если нам нужночтобы разделить его на отдельные столбцы, один параметр - separate из tidyverse, который будет split столбцом на отдельные столбцы на основе разделителя (_), а также гарантирует, что тип столбца будет convert ed

library(tidyverse)
data_frame(col1 = str1) %>%
    separate(col1, into = c("Author", "Volume", "Issue"), sep = "_", convert = TRUE)
# A tibble: 3 x 3
#  Author         Volume Issue
#  <chr>          <chr>  <chr>
#1 Hughson.George 54     4    
#2 Ifran.Dean     51     3    
#3 Houston.Amanda 49     6    

данные

str1 <- c("Hughson.George_54_4", "Ifran.Dean_51_3", "Houston.Amanda_49_6")
...