Извлеките все числа из одной строки в 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,.]+\\)?"
)), "\\)$|,", ""
),
"(", "-"
)
)