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

Предположим, что у вас есть строка:

strLine <- "The transactions (on your account) were as follows: 0 3,000 (500) 0 2.25 (1,200)"

Есть ли функция, которая выводит числа в массив/вектор, создавая следующее требуемое решение:

result <- c(0, 3000, -500, 0, 2.25, -1200)?

то есть.

result[3] = -500

Обратите внимание, что цифры представлены в форме учета, поэтому между() появляются отрицательные числа. Кроме того, вы можете предположить, что справа появляются только цифры справа от первого появления числа. Я не так хорош в regexp, поэтому буду признателен, если вы сможете помочь, если это потребуется. Кроме того, я не хочу предполагать, что строка всегда одна и та же, поэтому я хочу удалить все слова (и любые специальные символы) перед расположением первого номера.

Ответ 1

library(stringr)
x <- str_extract_all(strLine,"\\(?[0-9,.]+\\)?")[[1]]
> x
[1] "0"       "3,000"   "(500)"   "0"       "2.25"    "(1,200)"

Измените parens на negatives:

x <- gsub("\\((.+)\\)","-\\1",x)
x
[1] "0"      "3,000"  "-500"   "0"      "2.25"   "-1,200"

И затем as.numeric() или taRifx::destring, чтобы закончить (следующая версия destring будет поддерживать негативы по умолчанию, поэтому опция keep t необходимо):

library(taRifx)
destring( x, keep="0-9.-")
[1]    0 3000  -500    0    2.25 -1200

ИЛИ

as.numeric(gsub(",","",x))
[1]     0  3000  -500     0     2.25 -1200

Ответ 2

Здесь базовый R-путь, для полноты...

x <- unlist(regmatches(strLine, gregexpr('\\(?[0-9,.]+', strLine)))
x <- as.numeric(gsub('\\(', '-', gsub(',', '', x)))
[1]     0.00  3000.00  -500.00     0.00     2.25 -1200.00

Ответ 3

Для меня отлично работали при работе над одиночными строками в data frame (одна строка в строке в одном столбце):

library(taRifx)
DataFrame$Numbers<-as.character(destring(DataFrame$Strings, keep="0-9.-"))

Результаты выводятся в новом столбце из того же data frame.

Ответ 4

Так как это произошло в другом вопросе, это uncrutched stringi решение ( по сравнению с stringr костыль):

as.numeric(
  stringi::stri_replace_first_fixed(
    stringi::stri_replace_all_regex(
      unlist(stringi::stri_match_all_regex(
        "The transactions (on your account) were as follows: 0 3,000 (500) 0 2.25 (1,200)", 
        "\\(?[0-9,.]+\\)?"
      )), "\\)$|,", ""
    ),
    "(", "-"
  )
)