按数据类型拆分R中的字符串

时间:2017-10-31 14:50:52

标签: r regex

我有一个像这样的矢量: " XY13DJ" " J114HD" " E63NP" " F161JU" " AM76NZ" " PMI79DU"

我需要分成两个向量,例如" XY J E F AM PMI"和" 13DJ,114HD,63NP,161JU 76NZ,79DU"。

在字符串中,每当第一个数字到来时,数据应该被分割。

我编写了这样的代码无效:

enter code here
vector_1 = c()
vector_2 = c()
string_split <- function(ele){
    val <- regexpr('[0-9]',ele)[1]
    fn <- substr(ele,0,val-1)
    ln <- substr(ele,val,nchar(ele))
    vector_1 <- append(vector_1,fn)
    vector_2 <- append(vector_2,ln)
}
sapply(vector-to-pass, string_split)

2 个答案:

答案 0 :(得分:4)

如果您希望将其作为两列数据框,请尝试此操作或省略as.list

as.list(read.table(text = sub("(\\d)", " \\1", x), as.is = TRUE))

,并提供:

$V1
[1] "XY"  "J"   "E"   "F"   "AM"  "PMI"

$V2
[1] "13DJ"  "114HD" "63NP"  "161JU" "76NZ"  "79DU" 

答案 1 :(得分:0)

这是另一个基础R解决方案,它基于积极的前瞻和外观来分裂一个空元素:

as.data.frame(do.call(rbind, strsplit(vec, "(?<=\\p{L})(?=\\d+\\p{L}+$)", perl = TRUE)))

或者您也可以使用str_match中的stringr来匹配捕获组:

library(stringr)
as.data.frame(str_match(vec, "(^\\p{L}+)(\\d+\\p{L}+$)")[,-1])

<强>结果:

   V1    V2
1  XY  13DJ
2   J 114HD
3   E  63NP
4   F 161JU
5  AM  76NZ
6 PMI  79DU

数据:

vec = c("XY13DJ", "J114HD", "E63NP", "F161JU", "AM76NZ", "PMI79DU")