อีกทางเลือกหนึ่งคือการใช้การจับภาพย่อยการแสดงออกที่มีฟังก์ชั่นการแสดงออกปกติและregmatches
regexec
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"