gpt4 book ai didi

r - 将字符串分成字符

转载 作者:行者123 更新时间:2023-12-05 01:28:11 28 4
gpt4 key购买 nike

我有一些用字符串编码的有序测试结果。字符串可以是任意长度。字符串中的每个数字代表一个测试结果。下面以四种测试结果为例:

2069

我想通过将字符串拆分为单独的观察结果来在 R 中整理这些内容。 strsplitstring::str_split 没问题,它返回四个值,这将成为我的观察结果。

strsplit("2069" %>% as.character(), split = "") %>% unlist()
[1] "2" "0" "6" "9"

但是,现在我意识到有些结果的值大于 9。这些两位数的值已用括号编码以表明它们不是单独的结果。

例如,在下面的例子中,我仍然有四个值,但有些值已经用括号括起来,以便对大于 9 的值进行分组。

2(10)1(12)

我正在努力寻找一种方法来分解这些,以便我得到

[1] "2""10""1""12"

感谢任何指导。谢谢。

最佳答案

已更新 - 基于评论中显示的 OP 新模式的模式匹配。在这里,我们使用 str_extract 来提取一个或多个紧跟在左括号(regex lookaround )或 (|) 之后的任何字符括号 ([^()])

library(stringr)
str_extract_all(str1, "(?<=[(])\\d+|[^()]")
[[1]]
[1] "2" "10" "1" "12"

[[2]]
[1] "2" "0" "6" "9"

[[3]]
[1] "2" "15"

[[4]]
[1] "2" "1" "3" "1"

-测试OP的额外模式

str_extract_all(str2, "(?<=[(])\\d+|[^()]")
[[1]]
[1] "2" "10" "1" "12"

[[2]]
[1] "2" "0" "6" "9"

[[3]]
[1] "2" "15"

[[4]]
[1] "2" "1" "3" "1"

[[5]]
[1] "10" "0" "2" "0" "1"

-较早的解决方案(基于所有大于9的数字都会被包裹在括号内的假设)

我们可以在 base R 中的括号上拆分

unlist(strsplit(str1[1], "\\(|\\)"))
[1] "2" "10" "1" "12"

假设如果两种情况都存在,那么一个选项是获取那些带有括号的元素的索引并分别执行此操作

i1 <- grepl("\\(|\\)", str1)
lst1 <- vector('list', length(str1))
lst1[i1] <- strsplit(str1[i1], "\\(|\\)")
lst1[!i1] <- strsplit(str1[!i1], "")
unlist(lst1)
[1] "2" "10" "1" "12" "2" "0" "6" "9" "2" "15" "2" "1" "3" "1"

或者另一个选项是 ifelsegrepl 创建一个分隔符,然后使用 strsplit

lst1 <- strsplit(trimws(ifelse(grepl("\\(|\\)", str1), 
gsub("\\(|\\)", ",", str1), gsub("(?<=.)(?=.)", "\\1,\\2",
str1, perl = TRUE)), whitespace = ","), ",")
lst1
[[1]]
[1] "2" "10" "1" "12"

[[2]]
[1] "2" "0" "6" "9"

[[3]]
[1] "2" "15"

[[4]]
[1] "2" "1" "3" "1"

数据

str1 <- c("2(10)1(12)", "2069", "2(15)", "2131")
str2 <- c(str1, "(10)0201")

关于r - 将字符串分成字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68876537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com