1

次のベクトルで正規表現を使用することは可能ですか:

u<-c("first1","sec2","thir33","fourth4","fifth25","sixth16",
     "seven7","eight8","nine9","ten10","eleven11")

取得する:

[1] "first.1" "sec.2" "thir3.3" "fourth.4" "fifth2.5" "sixth1.6" "seven.7" "eight.8"
[9] "nine.9" "ten.10" "eleven.11"

これは私が得た限り近いです:

gsub("([A-Za-z]*)([1]{0,1})([0-9]$)","\\1\\.\\2\\3",u)
#[1] "first.1"   "sec.2"     "thir3.3"   "fourth.4"  "fifth2.5"  "sixth.16"  "seven.7"   "eight.8"   "nine.9"    "ten.10"   
#[11] "eleven.11"

6 番目の要素が正しくないことに注意してください。「sixth.16」は「sixth1.6」である必要があります。

4

3 に答える 3

4

ベクター内の位置を「知っている」またはアクセスできる内部正規表現メソッドは見当たりませんが、確かにそれを渡して、その「as.character」強制値をパターンで使用できます。

sapply(seq_along(u), function(x) sub(
                                     paste("(^.+)(", as.character(x), "$)", sep=""),
                                     "\\1.\\2", u[x]) )
 [1] "first.1"   "sec.2"     "thir3.3"   "fourth.4"  "fifth2.5"  "sixth1.6"  "seven.7"   "eight.8"   "nine.9"   
[10] "ten.10"    "eleven.11"
于 2012-08-23T23:50:10.337 に答える
1

これは特にきれいではありませんが、次の手順で 1 ステップで実行できます。

gsub("([A-Za-z]+)(10|11)?(?:(\\d)(\\d))?([0-9]{0,1}?)$","\\1\\3\\.\\2\\4\\5",u)

または、いくつかのステップに分割することもできます。最初に 1 桁を取得し、次に 2 桁のケースを個別に処理します。

v <- gsub("([A-Za-z]+)(\\d)$","\\1.\\2",u)
v <- gsub("([A-Za-z]+)(10|11)$","\\1.\\2",v)
v <- gsub("([A-Za-z]+\\d)(\\d)$","\\1.\\2",v)
于 2012-08-23T23:43:32.327 に答える
1

DWinの回答を出発点として使用すると、要素1:9、10:99、100:999などをすべて同じように処理する必要があることを知ることで、速度を上げることができます(実際の問​​題がはるかに長いベクトルに取り組むと仮定)それぞれの方法。

だから、いくつかのより大きなデータを取得します

u<-c("first1","sec2","thir33","fourth4","fifth25","sixth16",
     "seven7","eight8","nine9","ten10","eleven11")
u[12:101981]<-NA

set.seed(1)
for(i in 12:101981)u[i]<-paste0(paste(sample(c(LETTERS,1:9),5),collapse=""),i)

lengthu<-length(u)
maxLength<-nchar(lengthu)
theStart<-10^(seq_len(maxLength)-1)
theEnd<-c(theStart[-1]-1,lengthu)

次に、 のsapply各要素でuはなく、長さのシーケンスで使用しますmaxLength

tempans<-sapply(seq_len(maxLength),function(x){
  sub(paste0("(^.*)(\\d{",x,"})"),"\\1.\\2",u[theStart[x]:theEnd[x]])
})
tail(unlist(tempans))
# [1] "DWY96.101976" "UWFCO.101977" "UR5L8.101978" "XBQ9V.101979" "48MTI.101980"
# [6] "75LIS.101981"

head(unlist(tempans))
# [1] "first.1"  "sec.2"    "thir3.3"  "fourth.4" "fifth2.5" "sixth1.6"
于 2012-08-24T06:29:02.227 に答える