我有一个字符串变量要解析成两部分。我想我会使用包中str_match
的方法来解决这个问题stringr
,它返回一个矩阵,第一列中包含原始字符串,而其他列中的每个提取部分。
我找到了大约十几个正则表达式来提取这两个部分。(这些部分是一个梯子,按工资计划排列,非常混乱。我已经通过使用一堆嵌套ifelse
语句定义一个函数来验证我的正则表达式是否有效。)
library(stringr)
library(data.table)
my_strs <- c("A 01","G 00","A 2")
mydt <- data.table(strs = my_strs)
rx1 <- '^([[:alpha:]] )([[:digit:]]{2})$'
rx2 <- '(A) ([[:digit:]])'
我想按顺序检查正则表达式并使用第一个签出的部分提取部分。如果我只有一个正则表达式,我可以这样做:
myfun <- function(x){
y <- str_match(x,rx1)
return(y)
}
mydt[,myfun(strs)]
# [,1] [,2] [,3]
# [1,] "A 01" "A " "01"
# [2,] "G 00" "G " "00"
# [3,] NA NA NA
(我花了很长时间才让它工作,尝试了函数的所有组合Vectorize
以及调用中的 ing。)as.list
*apply
我按顺序检查正则表达式的最佳尝试是这个相当丑陋的组合:
myfun2 <- function(x){
y <- str_match(x,rx1)
ifelse(!is.na(y[1]),"",(y <- str_match(x,rx2))[1])
return(y)
}
mydt[1:2,myfun2(strs)]
# [,1] [,2] [,3]
# [1,] "A 01" "A " "01"
# [2,] "G 00" "G " "00"
mydt[3,myfun2(strs)]
# [,1] [,2] [,3]
# [1,] "A 2" "A" "2"
mydt[1:3,myfun2(strs)]
# [,1] [,2] [,3]
# [1,] "A 01" "A " "01"
# [2,] "G 00" "G " "00"
# [3,] NA NA NA
如您所见,它还没有完全起作用。
您对解决此问题的更好方法有任何想法吗?我的数据集中有大约 3.5 m 行,但这个字符串只有大约 2000 个唯一值,所以我并不担心效率。