Alternatif lain adalah menggunakan sub-ekspresi menangkap dengan fungsi ekspresi reguler regmatches
dan regexec
.
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
Ini mengembalikan seluruh string, karakter pertama, dan hasil "muncul" dalam daftar panjang 1.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
yang setara dengan list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))
. Artinya, ini berisi himpunan super dari elemen yang diinginkan serta string lengkap.
Menambahkan sapply
akan memungkinkan metode ini berfungsi untuk vektor karakter dengan panjang> 1.
# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
Ini mengembalikan daftar dengan string lengkap yang cocok sebagai elemen pertama dan subekspresi yang cocok ditangkap ()
sebagai elemen berikut. Jadi dalam ekspresi reguler '(^.)(.*)'
, (^.)
cocokkan karakter pertama dan (.*)
cocok dengan karakter yang tersisa.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
[[2]]
[1] "right back" "r" "ight back"
[[3]]
[1] "at yah" "a" "t yah"
Sekarang, kita dapat menggunakan metode sapply
+ terpercaya [
untuk menarik substring yang diinginkan.
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"
sapply
untuk ekstraksi. "meletuskan" karakter pertama, sebagaimana ditentukan dalam pertanyaan, adalah masalah mengulangi proses ini pada vektor yang dihasilkan (mySecondStrings).