извлекать числа в указанной c позиции в векторе в r - PullRequest
1 голос
/ 26 мая 2020

У меня много векторов, и каждый элемент имеет 3 числа, и я хочу извлечь его в разные столбцы.

test <- '1.0226 [1.0109; 1.0344]'

Я ожидал

rr <- 1.0226
low_95 <- 1.0109
up_95 <- 1.0344

Я подумал, что должен используйте для этого функцию str_extract(), но я не знаю, как написать регулярное выражение.

rr: извлечь число перед [;

low_95: извлечь число между [ и ;;

up_95: извлечь число между ; и ].

Ответы [ 7 ]

2 голосов
/ 26 мая 2020

Регулярное выражение для извлечения числа перед [ в R: *\\[.*

test <- '1.0226 [1.0109; 1.0344]'

rr <- gsub(" *\\[.*", "", test)
rr
# [1] "1.0226"

Регулярное выражение для извлечения числа между [ и ; в R: .*\\[|;.*

test <- '1.0226 [1.0109; 1.0344]'

low_95 <- gsub(".*\\[|;.*", "", test)
low_95
# [1] "1.0109"

Регулярное выражение для извлечения числа от ; до ] в R: .*; |].*

test <- '1.0226 [1.0109; 1.0344]'

up_95 <- gsub(".*; |].*", "", test)
up_95
# [1] "1.0344"
2 голосов
/ 26 мая 2020

мы могли бы использовать strcapture из базы R:

prt <- data.frame(rr = numeric(),low_95 = numeric(), up_95 = numeric())

strcapture("(\\d+\\.?\\d+)\\D+\\[((?1));\\s*((?1))\\]",test,prt,perl = TRUE)


    rr low_95  up_95
1 1.0226 1.0109 1.0344
1 голос
/ 26 мая 2020

С data.table:

test <- '1.0226 [1.0109; 1.0344]'
data.table::tstrsplit(test, " \\[|; |\\]")
[[1]]
[1] "1.0226"

[[2]]
[1] "1.0109"

[[3]]
[1] "1.0344"
1 голос
/ 26 мая 2020

Если числа каждый раз находятся в одной и той же позиции, вы можете использовать read.table после удаления []; с gsub.

read.table(text=gsub("[][;]", "", test), col.names=c("rr","low_95","up_95"))
#      rr low_95  up_95
#1 1.0226 1.0109 1.0344
1 голос
/ 26 мая 2020

Если вы собираетесь иметь другие значения в test, вы можете extract из tidyr.

data.frame(test) %>%
   tidyr::extract(test, paste0('num', 1:3), '(.*)\\[(.*);\\s*(.*)\\]')
0 голосов
/ 26 мая 2020

Интересный способ сделать это - использовать sub и множественные обратные ссылки:

strsplit(gsub("(^\\d+\\.\\d+)\\s\\[(\\d+\\.\\d+);\\s(\\d+\\.\\d+)]", "\\1,\\2,\\3", test), ",")
[[1]]
[1] "1.0226" "1.0109" "1.0344"

Оттуда вы можете продолжить, назначив элементы выбранным вами векторам, например:

rr <- unlist(strsplit(gsub("(^\\d+\\.\\d+)\\s\\[(\\d+\\.\\d+);\\s(\\d+\\.\\d+)]", "\\1,\\2,\\3", test), ","))[1]
[1] "1.0226"
0 голосов
/ 26 мая 2020

Используя базу R с gregexpr, мы можем просто извлечь все числа, а затем назначить их отдельным переменным:

test <- '1.0226 [1.0109; 1.0344]'
matches <- gregexpr('\\b\\d+(?:\\.\\d+)?\\b', test, perl=TRUE)
vec <- regmatches(test, matches)[[1]]
vec
rr <- vec[1]
low_94 <- vec[2]
up_95 <- vec[3]

[1] "1.0226" "1.0109" "1.0344"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...