Một lựa chọn khác là sử dụng chụp tiểu biểu với các chức năng biểu hiện thường xuyên regmatches
và regexec
.
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
này trả về toàn bộ chuỗi, ký tự đầu tiên, và "popped" kết quả trong một danh sách dài 1.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
tương đương với list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))
.Nghĩa là, nó chứa tập hợp siêu các phần tử mong muốn cũng như chuỗi đầy đủ.
Thêm sapply
sẽ cho phép phương pháp này để làm việc cho một vector đặc trưng của length> 1.
# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
này trả về một danh sách với chuỗi đầy đủ phù hợp là yếu tố đầu tiên và subexpressions khớp bắt bởi ()
như các yếu tố sau. Vì vậy, trong biểu thức chính quy '(^.)(.*)'
, (^.)
khớp với ký tự đầu tiên và (.*)
khớp với các ký tự còn lại.
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
[[2]]
[1] "right back" "r" "ight back"
[[3]]
[1] "at yah" "a" "t yah"
Bây giờ, chúng ta có thể sử dụng các phương pháp đáng tin cậy sapply
+ [
phải rút ra khỏi các chuỗi con mong muốn.
myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back" "t yah"
Đây là một mẹo rất hay nhưng tôi nghĩ rằng bỏ lỡ câu hỏi. – pedrosaurio
Bạn sẽ cần phải giải thích thêm vì nó có thể tạo ra cùng một đầu ra như các câu trả lời khác. Xem khối mã cuối cùng sử dụng 'sapply' để trích xuất. "popping" ký tự đầu tiên, như được chỉ định trong câu hỏi, là vấn đề lặp lại quá trình này trên vectơ kết quả (mySecondStrings). – lmo
Chắc chắn nó hoạt động với lời giải thích thêm bạn vừa thêm nhưng tôi vẫn thấy nó phức tạp hơn nó nên. – pedrosaurio