从R中的一个字符列创建两个数值列

iugsix8n  于 2023-01-18  发布在  其他
关注(0)|答案(6)|浏览(467)

置信区间列的类型为字符
| 置信区间|
| - ------|
| (245.0至345.2)|
| (第434.1至432.1段)|
| (一百二十三点五至一百二十点二)|
我想创建两个数值列,例如在括号中包含第一个值的Upper Interval和包含第二个值的Lower Interval
| 区间上限|区间下限|
| - ------|- ------|
| 二百四十五元|345.2美元|
| 434.1|432.1美元|
| 一百二十三点五|小行星1120.2|
如何使用R来实现这一点?
谢谢

lb3vh1jj

lb3vh1jj1#

来自tidyrextract()适合您的情况。

library(tidyr)

df %>%
  extract(confidence_interval, into = c("Upper", "Lower"),
          regex = "\\((.+),(.+)\\)", convert = TRUE)

# # A tibble: 3 × 2
#   Upper Lower
#   <dbl> <dbl>
# 1  245   345.
# 2  434.  432.
# 3  124.  901.
ozxc1zmp

ozxc1zmp2#

这是将sapplystrsplitgsub结合使用的一种方法

setNames(data.frame(t(sapply(strsplit(df$confidence_interval, " - "), function(x)
  gsub("\\(|\\)", "", x)))), c("Upper Interval", "Lower Interval"))
  Upper Interval Lower Interval
1          245.0          345.2
2          434.1          432.1
3          123.5        1,901.2
数据
df)
structure(list(confidence_interval = c("(245.0 - 345.2)", "(434.1 - 432.1)",
"(123.5 - 1,901.2)")), class = "data.frame", row.names = c(NA,
-3L))
ni65a41a

ni65a41a3#

这里有一个解决方案。

ci <- c('(245.0,345.2)', '(434.1,432.1)', '(123.5,901.2)')

values <- strsplit(gsub('\\(|\\)', '', ci), split = ",")

upper <- sapply(values, function(x) as.numeric(x[[1]]))
lower <- sapply(values, function(x) as.numeric(x[[2]]))

upper
#> [1] 245.0 434.1 123.5
lower
#> [1] 345.2 432.1 901.2

我用gsub去掉括号,然后用strsplit拆分,两边的值,然后用sapply返回这个向量,因为strsplit的返回值是列表的列表。

OP问题已编辑

如果值之间的分隔符为“-”,则应使用values <- strsplit(gsub('\\(|\\)', '', ci), split = " - ")
strsplit中的split参数是函数用来将字符串拆分为两部分的参数。

tcomlyy6

tcomlyy64#

library(tidyverse)

ci <- c('(245.0,345.2)', '(434.1,432.1)', '(123.5,901.2)')      
data.frame(ci) |> 
  mutate(ci2 = stringr::str_replace_all(ci, "\\(|\\)", "")) |> 
  separate(ci2, c('upper', 'lower'), sep =",", convert = TRUE)
#>              ci upper lower
#> 1 (245.0,345.2) 245.0 345.2
#> 2 (434.1,432.1) 434.1 432.1
#> 3 (123.5,901.2) 123.5 901.2
dsekswqp

dsekswqp5#

df %>%
  mutate(across(confidence_interval, ~ str_remove_all(.x, "[^0-9,\\.]"))) %>%
  separate(col = confidence_interval,
           into = c("higher", "lower"),
           sep = ",", convert = TRUE)

# A tibble: 3 × 2
  higher lower
   <dbl> <dbl>
1   245   345.
2   434.  432.
3   124.  901.
hmae6n7t

hmae6n7t6#

使用strcapture

ci <- c('(245.0,345.2)', '(434.1,432.1)', '(123.5,901.2)')

pattern <- "\\(([-.0-9]+),([-.0-9]+)\\)"
strcapture(pattern, ci, data.frame(upper.interval=numeric(), lower.interval=numeric()))

  upper.interval lower.interval
1          245.0          345.2
2          434.1          432.1
3          123.5          901.2

相关问题