Предположим, что вектор включает некоторые доверительные интервалы, как показано ниже.
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)
Вы можете использовать функции из библиотеки стрингер.
Вы можете разделить строки с помощью 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
Базовое решение 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
Другая 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 вам.
mypattern <- '\\[(\\d+\\.\\d+) ; (\\d+\\.\\d+)\\]'
as.numeric(gsub(mypattern, '\\1', confint))
as.numeric(gsub(mypattern, '\\2', confint))
Тем временем я придумал другое base R
решение
lower <- as.numeric(sub(".]*", "", sub(";.*", "", confint)))
upper <- as.numeric(sub("].*", "", sub(".*;", "", confint)))
Спасибо вам всем!
tidyverse
решение:
library(dplyr)
library(tidyr)
df = data.frame(confint)
df = df %>%
mutate(confint = gsub("(\\[|\\])","",confint)) %>%
separate(confint,c("lower","upper"),";",convert=T)
@Ronak Shah Я обновил свой пост в соответствии с некоторыми вашими идеями. Спасибо :)