strsplit
创建一个列表,所以我会尝试以下操作:
lapply(strsplit(oss$id, split='_', fixed=TRUE), `[`, 3) ## Output a list
sapply(strsplit(oss$id, split='_', fixed=TRUE), `[`, 3) ## Output a vector (even though a list is also a vector)
The [
意思是提取第三个元素。如果您更喜欢向量,请替换lapply
with sapply
.
这是一个例子:
mystring <- c("A_B_C", "D_E_F")
lapply(strsplit(mystring, "_"), `[`, 3)
# [[1]]
# [1] "C"
#
# [[2]]
# [1] "F"
sapply(strsplit(mystring, "_"), `[`, 3)
# [1] "C" "F"
如果有一个容易定义的模式,gsub
可能也是一个不错的选择,并且可以避免分裂。请参阅 DWin 和 Josh O'Brien 的改进(更强大)版本的评论。
gsub(".*_.*_(.*)", "\\1", mystring)
# [1] "C" "F"
最后,只是为了好玩,您可以扩展unlist
方法通过回收向量使其工作TRUE
s and FALSE
s 提取每三个项目(因为我们事先知道所有拆分都会产生相同的结构)。
unlist(strsplit(mystring, "_"), use.names = FALSE)[c(FALSE, FALSE, TRUE)]
# [1] "C" "F"
如果您不按数字位置提取,而只是想提取分隔符后的最后一个值,则有几种不同的选择。
使用贪婪的正则表达式:
gsub(".*_(.*)", "\\1", mystring)
# [1] "C" "F"
使用像这样的便利功能stri_extract*
来自“stringi”包:
library(stringi)
stri_extract_last_regex(mystring, "[A-Z]+")
# [1] "C" "F"