2 つの部分に解析する文字列変数があります。最初の列に元の文字列があり、他の列に抽出された各部分があるマトリックスを返すパッケージを使用str_match
して、これにアプローチすると考えました。stringr
これら 2 つの部分を抽出するための正規表現を約 10 個見つけました。(パーツははしごであり、支払いスケジュールのラングであり、非常に面倒です。一連のネストされた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:]])'
正規表現を順番にチェックし、最初にチェックアウトしたものを使用してパーツを抽出したいと思います。正規表現が 1 つしかない場合は、次のようにすることができます。
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
ご覧のとおり、まだ完全には機能していません。
これにアプローチするためのより良い方法について何か考えはありますか? データ セットには約 350 万行ありますが、この文字列の一意の値は約 2000 しかないため、効率についてはあまり心配していません。