อีกทางเลือกหนึ่งคือการใช้การจับภาพย่อยการแสดงออกที่มีฟังก์ชั่นการแสดงออกปกติและregmatchesregexec
x <- 'hello stackoverflow'
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
สิ่งนี้จะส่งคืนสตริงทั้งหมดอักขระตัวแรกและผลลัพธ์ "popped" ในรายการความยาว 1
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
ซึ่งเทียบเท่ากับlist(c(x, substr(x, 1, 1), substr(x, 2, nchar(x)))). นั่นคือมันมีชุดสุดยอดขององค์ประกอบที่ต้องการและสตริงแบบเต็ม
การเพิ่มsapplyจะช่วยให้วิธีนี้ใช้ได้กับเวกเตอร์อักขระที่มีความยาว> 1
xx <- c('hello stackoverflow', 'right back', 'at yah')
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
ส่งคืนรายการที่มีสตริงเต็มที่ตรงกันเป็นองค์ประกอบแรกและนิพจน์ย่อยที่ตรงกันที่จับโดย()องค์ประกอบต่อไปนี้ ดังนั้นในนิพจน์ทั่วไป'(^.)(.*)'ให้(^.)จับคู่อักขระตัวแรกและ(.*)จับคู่อักขระที่เหลือ
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
[[2]]
[1] "right back" "r" "ight back"
[[3]]
[1] "at yah" "a" "t yah"
ตอนนี้เราสามารถใช้วิธี trusty sapply+ [เพื่อดึงสตริงย่อยที่ต้องการออกมา
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"