在数字之间分割字符串

时间:2018-12-29 14:24:24

标签: r string split

类似于此处上传的问题: Split string and numbers 我有一个包含数字和单词的字符串,其模式为:

20.40title1. description1. 21.00title2. description2 ... 

我希望拥有的最终产品具有以下形式

Hour   title   description
20.40  title1  description1
21.00  title2  description2
 ...    ...       ...

因此,我可能需要在每次出现数字之前先拆分字符串,然后再用“。”的第一个外观再次拆分字符串。 我的第一步遇到了麻烦。

谢谢, 大卫

3 个答案:

答案 0 :(得分:4)

由于分隔符的宽度为零,因此将其视为提取或匹配任务而不是拆分任务似乎更容易。对于这种方法,您首先要编写正则表达式以匹配要提取的每个片段。 stringr::str_match函数是一种方便的方法。

x <- "20.40title1. description1. 21.00title2. description2"

out <- do.call(
    cbind,
    str_match_all(
        x,
        c("\\d+\\.\\d+",
          "title\\d+",
          "description\\d+")))

如果需要,您可以清理并命名结果;

out <- setNames(type.convert(as.data.frame(out)),
                c("Hour", "title", "description"))
out
##   Hour  title  description
## 1 20.4 title1 description1
## 2 21.0 title2 description2

答案 1 :(得分:1)

使用i

tidyverse

数据

library(tidyverse)
df %>% mutate(A=gsub('(description\\d)','\\1-',A)) %>% 
       separate_rows(A,sep='-') %>% 
       mutate(Hour=str_extract(A,'\\d{2}.\\d{2}'),Title=str_extract(A,'title\\d+'), Description=str_extract(A,'description\\d+')) %>% 
       filter(!is.na(Hour))

                            A  Hour  Title  Description
1   20.40title1. description1 20.40 title1 description1
2 . 21.00title2. description2 21.00 title2 description2

答案 2 :(得分:1)

另一种选择是使用strapply中的gsubfn

ss <- "20.40title1. description1. 21.00title2. description2"

library(gsubfn)
strapply(
    strsplit(ss, "\\s(?=\\d)", perl = T), "(\\d+\\.?\\d*)(\\w+)\\.*\\s+(\\w+)\\.*",
    c, combine = list, simplify = x ~ do.call(rbind, x))
#     [,1]    [,2]     [,3]
#[1,] "20.40" "title1" "description1"
#[2,] "21.00" "title2" "description2"