Как извлечь нижнюю и верхнюю границу в числовом формате из строки доверительного интервала? - PullRequest
10 голосов
/ 27 мая 2019

Предположим, что вектор включает некоторые доверительные интервалы, как показано ниже

confint <- c("[0.741 ; 2.233]", "[263.917 ; 402.154]", "[12.788 ; 17.975]", "[0.680 ; 2.450]", "[0.650 ; 1.827]", "[0.719 ; 2.190]")

Я хочу иметь два новых вектора, один из которых включает нижние пределы в числовом формате как

lower <- c(0.741, 263.917, 12.788, 0.680, 0.650 , 0.719)

и другие, включая верхние пределы в числовом формате, например

upper <- c(2.233, 402.154, 17.975, 2.450, 1.827, 2.190)

Ответы [ 6 ]

12 голосов
/ 27 мая 2019

Базовый раствор R

lower =  as.numeric(sub(".*?(\\d+\\.\\d+).*", "\\1", confint))
upper =  as.numeric(sub(".*\\b(\\d+\\.\\d+).*", "\\1", confint))

lower
[1]   0.741 263.917  12.788   0.680   0.650   0.719
upper
[1] 2.233 402.154  17.975   2.450   1.827   2.190
3 голосов
/ 27 мая 2019
mypattern <- '\\[(\\d+\\.\\d+) ; (\\d+\\.\\d+)\\]'
as.numeric(gsub(mypattern, '\\1', confint))
as.numeric(gsub(mypattern, '\\2', confint))
2 голосов
/ 27 мая 2019

Тем временем я придумал другое base R решение

lower <- as.numeric(sub(".]*", "", sub(";.*", "", confint)))
upper <- as.numeric(sub("].*", "", sub(".*;", "", confint)))

Спасибо всем!

2 голосов
/ 27 мая 2019

Другая возможность base R может быть:

sapply(strsplit(confint, " ; ", fixed = TRUE), function(x) gsub("[^0-9.-]+", "\\1", x) [1])
sapply(strsplit(confint, " ; ", fixed = TRUE), function(x) gsub("[^0-9.-]+", "\\1", x) [2])

[1] "0.741"   "263.917" "12.788"  "0.680"   "0.650"   "0.719"  
[1] "2.233"   "402.154" "17.975"  "2.450"   "1.827"   "2.190" 

Если вам нужно это как числовой вектор:

sapply(strsplit(confint, " ; ", fixed = TRUE), function(x) as.numeric(gsub("[^0-9.-]+", "\\1", x)) [1])
sapply(strsplit(confint, " ; ", fixed = TRUE), function(x) as.numeric(gsub("[^0-9.-]+", "\\1", x)) [2])
1 голос
/ 27 мая 2019

A tidyverse решение:

library(dplyr)
library(tidyr)

df = data.frame(confint)
df = df %>% 
  mutate(confint = gsub("(\\[|\\])","",confint)) %>% 
    separate(confint,c("lower","upper"),";",convert=T)
1 голос
/ 27 мая 2019

Вы можете использовать функции из библиотеки stringr .

Вы можете разделить строки с помощью str_split() в соответствии с определенным символом (; в вашем случае), а затем удалить символ с помощью str_remove() ([ и ] в вашем случае), и вы получите то, что хотите.

str_remove(str_split_fixed(confint, ";", n = 2)[,1], '\\[') %>% as.numeric()
# [1]   0.741 263.917  12.788   0.680   0.650   0.719
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...