【问题标题】:R: How can I split a string into several strings depending on the string's elements' lengthsR:如何根据字符串元素的长度将字符串拆分为多个字符串
【发布时间】:2020-07-01 19:27:39
【问题描述】:

我的问题由两部分组成:

  1. 如何根据元素的长度将一个字符串拆分为多个字符串?

  2. 如何根据字符串元素的长度动态创建先验未知数量的字符串?

我的目标是拆分字符串:

text <- "a.a 5bb c- dd e f"

根据元素的长度分成多个字符串:

string1 <- "e f"
string2 <- "c- dd"
string3 <- "a.a 5bb"

此外,在我的应用程序中,事先并不清楚需要创建多少个字符串,因为字符串 text 可能包含不同长度的元素,具体取决于代码将要执行的上下文。

是否可以动态创建灵活数量的字符串,其中要创建的字符串的名称包含它收集的元素的长度?例如,要创建的收集长度为 9 的元素的字符串应命名为“string9”。

【问题讨论】:

  • 根据长度,字符串有不同的长度
  • @akrun 我假设您的评论是指我问题的第二部分。要创建的结果字符串肯定会有不同的长度,真的。但是,我的问题不在于字符串本身的长度;我的问题是关于字符串应该收集的元素的长度。

标签: r regex stringr


【解决方案1】:

尚不清楚您使用什么标准来拆分字符串,但当然可以创建一个按长度分组和命名的字符向量列表。

假设你有一个这样的字符串:

set.seed(69)
x <- sample(c(" ", letters), 200, prob = c(0.3, rep(0.8/26, 26)), replace = TRUE)
x <- gsub(" +", " ", paste(x, collapse = ""))
x
#> [1] "kscwew t wey n tg co cn opxbhdqpiflaoic f jusfyn ssk m wfiwrhqyt 
zdjgspimramrunsqslo h dht pjnqgy vbo luy nrzkm gz m slu mgi wuqr qbreifaoz jg qe shga 
mfbuhe o dmwsor ko zmdpucv w a ugc"

并且您想根据空格的位置将其拆分为多个片段,因此您有一个由多个不同长度的字符串组成的长向量(原始字符串中的“单词”):

all_strings <- strsplit(x, " ")[[1]]

现在你需要做的就是根据字符串的长度split,我们用nchar得到:

nchar_list <- split(all_strings, nchar(all_strings))
nchar_list
#> $`1`
#> [1] "t" "n" "f" "m" "h" "m" "o" "w" "a"
#> 
#> $`2`
#> [1] "tg" "co" "cn" "gz" "jg" "qe" "ko"
#> 
#> $`3`
#> [1] "wey" "ssk" "dht" "vbo" "luy" "slu" "mgi" "ugc"
#> 
#> $`4`
#> [1] "wuqr" "shga"
#> 
#> $`5`
#> [1] "nrzkm"
#> 
#> $`6`
#> [1] "kscwew" "jusfyn" "pjnqgy" "mfbuhe" "dmwsor"
#> 
#> $`7`
#> [1] "zmdpucv"
#> 
#> $`9`
#> [1] "wfiwrhqyt" "qbreifaoz"
#> 
#> $`15`
#> [1] "opxbhdqpiflaoic"
#> 
#> $`19`
#> [1] "zdjgspimramrunsqslo"

reprex package (v0.3.0) 于 2020-07-01 创建

【讨论】:

  • 这看起来很对!与我需要的唯一不同的是字符向量由一个字符串而不是多个字符串组成,即"t n f m h ..." 而不是"t" "n" "f" "m" "h" ...。玩弄paste(..., collapse = ' ') 可能会解决它。
【解决方案2】:

感谢艾伦的回复,我可以解决我的问题。下面的代码实现了我想要的。

library(dplyr)

text <- "a.a 5bb c- dd e f abcde 12345" 

string <- strsplit(text, " ")[[1]] %>% 
    split(., nchar(.)) %>% 
    lapply(., paste, collapse = ' ')

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 2022-11-15
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多