Извлечь число между подчеркиванием в тексте

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

  • Хьюсон.Джордж_54_4
  • Ifran.Dean_51_3
  • Хьюстон, Аманда_49_6

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

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

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

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

0
0
553
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Или с sub

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

Если нам нужно разделить его на отдельные столбцы, одним из вариантов является separate из tidyverse, который разделит столбец на отдельные столбцы на основе разделителя (split), а также обеспечит, чтобы тип столбца был _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")

Привет, все эти файлы находятся в папке, и я их читаю, так что примерно 1303 файла. apapers <- VCorpus(DirSource(my.text.location)) class(apapers) summary(apapers) papertitles <- unlist(meta(apapers,tag='id')) papertitlesissues <- str_extract_all(papertitles, "[^a-z](?:[^_]+_){0}([^_ ]+$)") Итак, это в основном относится к "бумажным заголовкам".

darkpunk 13.09.2018 19:31

@darkpunk Нет проблем. Вы можете получить имена всех файлов с помощью list.files, то есть tools::file_path_sans_ext(basename(lis.files()))

akrun 13.09.2018 19:32

О, чтение - это не проблема, наш профессор сказал нам определенным образом, и я придерживаюсь этого, но я попробую этот метод. Это просто небольшая проблема, в которой я, кажется, не могу понять, почему лишний _

darkpunk 13.09.2018 19:34

Постараюсь с этим поработать и проверить. Ценить это!

darkpunk 13.09.2018 19:38

Да, separate тоже справился со своей задачей. Так много способов сделать что-то вроде этого. Замечательная помощь!

darkpunk 13.09.2018 20:06
Ответ принят как подходящий

ты ищешь:

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)

Да, именно так. Просто вначале мне нужно создать корпус, а с этого момента нужно сделать его фреймом данных.

darkpunk 13.09.2018 19:40

Да, я его уже создал. my.text.location <- "C:/Users/mrina/OneDrive/Documents/Text/Chap 4/EnglishAbstract/" apapers <- VCorpus(DirSource(my.text.location)) papertitles <- unlist(meta(apapers,tag='id')) papertitles

darkpunk 13.09.2018 19:43

затем вместо веревки поставьте бумажную коробку и запустите код

Onyambu 13.09.2018 19:44

Пробовал, что дало мне ошибку. Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : line 703 did not have 3 elements

darkpunk 13.09.2018 19:47

Это тоже здорово!

darkpunk 13.09.2018 19:57

Также, если я хочу добавить еще один столбец «Идентификатор», который является числовым, например 1,2,3,4 перед «Авторы», как я могу этого добиться?

darkpunk 13.09.2018 20:04

просто сначала сохраните фрейм данных, это a = read.table(…), затем выполните cbind(id = 1:nrow(a),a)

Onyambu 13.09.2018 20:07

Ценить это!!

darkpunk 13.09.2018 20:11

Часть [^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

Похоже, это сработало как решение. Спасибо. Да, основная задача - просто создать фрейм данных, но мой профессор хотел, чтобы мы создали такие объекты, как «Автор», «Том» и т. д., А затем использовали их для создания фрейма данных.

darkpunk 13.09.2018 19:50

Другие вопросы по теме