Есть ли способ извлечь числа из строк, которые появляются последними?

asd <- c("asdf sfsfsd54 sdfsdfsdf sdfsdfsf654")
asd1 <- c("asdf sfsfsd54 sdfsdfsdf sdfsdfsf65421")

Ожидаемый результат

new_asd 
654

new_asd1
65421
r
2
manu p 11 Янв 2022 в 13:32
Отвечает ли это на ваш вопрос? Извлечение чисел из векторов строк
 – 
Maël
11 Янв 2022 в 13:37
Нет Нет. Дело в том, что извлекать нужно только те числа, которые стоят последними
 – 
manu p
11 Янв 2022 в 13:38
Существуют ли строки, которые не заканчиваются цифрами? Если да, то как вы надеетесь справиться с ними? Вы хотите вернуть NA или вернуть ближайшее к концу число? Если первое, то в регулярном выражении потребуется $. Многие ответы ниже дадут вам последний результат.
 – 
Michael Dewar
11 Янв 2022 в 15:26

7 ответов

Этот код всегда извлекает последние числовые записи в строке:

(stringr::str_extract(asd, stringr::regex("(\\d+)(?!.*\\d)")))
"654"
(stringr::str_extract(asd1, stringr::regex("(\\d+)(?!.*\\d)")))
"65421"

Если вы хотите получить только число, когда самый последний символ строки является числом, вы можете реализовать простое условие ifelse, чтобы проверить это конкретно, например:

x<- c("asdf sfsfsd54 sdfsdfsdf sdfsdfsf654f")
ifelse(!is.na(as.numeric(substr(x, nchar(x), nchar(x)))), 
       (stringr::str_extract(x, stringr::regex("(\\d+)(?!.*\\d)"))),
       NA)
NA #returns NA because last entry of string is not numeric ("f")
3
JKupzig 11 Янв 2022 в 17:07
Ваше регулярное выражение неправильно извлекает «1» из «a1a».
 – 
Michael Dewar
11 Янв 2022 в 14:13
Я добавил условие ifelse, чтобы учесть это как расширение моего кода. Спасибо за комментарий.
 – 
JKupzig
11 Янв 2022 в 17:16

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

library(stringr)

get_num = function(x) {
    str_remove_all(rev(unlist(str_split(x, " ")))[1], "[a-z]")
}
> get_num(asd)
[1] "654"
> get_num(asd1)
[1] "65421"
1
user438383 11 Янв 2022 в 13:51

Если строка всегда заканчивается цифрами, мы можем попробовать gsub

> x <- c("asdf sfsfsd54 sdfsdfsdf sdfsdfsf654", "asdf sfsfsd54 sdfsdfsdf sdfsdfsf65421")

> gsub(".*\\D", "", x, perl = TRUE)
[1] "654"   "65421"
1
ThomasIsCoding 11 Янв 2022 в 13:56

Для вашей ситуации достаточно одного регулярного выражения.

stringr::str_extract(asd, "(\\d+$)")

$ привязывает группу захвата к концу строки.

1
Michael Dewar 11 Янв 2022 в 14:15

Мы также можем использовать stri_extract_last_regex из stringi

> library(stringi)
> stri_extract_last_regex(asd, "\\d+")
[1] "654"
> stri_extract_last_regex(asd1, "\\d+")
[1] "65421"
1
akrun 11 Янв 2022 в 20:14

Я бы использовал sub в сочетании с ifelse здесь:

x <- c("asdf sfsfsd54 sdfsdfsdf sdfsdfsf654", "abc", "123")
nums <- ifelse(grepl("\\d$", x), sub(".*?(\\d+)$", "\\1", x), "")
nums

[1] "654" ""    "123"
1
Tim Biegeleisen 11 Янв 2022 в 13:43

Вы можете сделать что-то вроде этого:

library(stringr)
val <- str_extract_all(asd1, "\\d+")[[1]]
tail(val, 1)
"65421"

ИЛИ

as.numeric(gsub("[^\\d]+", "", asd, perl=TRUE))
val <- regmatches(asd1, gregexpr("[[:digit:]]+", asd1))[[1]]
tail(val, 1)
"65421"
0
Vishal A. 11 Янв 2022 в 13:49