在R中,按特定字符分割字符向量; 在新的矢量中保存第3件

A.B*_*man 4 r vector

我有一个'aaa_9999_1'形式的数据向量,其中第一部分是alpha位置代码,第二部分是四位数年份,最后一个是唯一的点标识符.例如,有多个sil_2007_X点,每个点都有不同的最后一位数.我需要使用"_"字符拆分此字段,并仅将唯一ID号保存到新矢量中.我试过了:

oss$point <- unlist(strsplit(oss$id, split='_', fixed=TRUE))[3]
Run Code Online (Sandbox Code Playgroud)

基于此处的响应:R删除部分字符串.我收到"1"的单一回复.如果我跑

strsplit(oss$id, split= ‘_’, fixed=TRUE)
Run Code Online (Sandbox Code Playgroud)

我可以生成拆分列表:

> head(oss$point)
[[1]]
[1] "sil"  "2007" "1"   

[[2]]
[1] "sil"  "2007" "2"   

[[3]]
[1] "sil"  "2007" "3"   

[[4]]
[1] "sil"  "2007" "4"   

[[5]]
[1] "sil"  "2007" "5"   

[[6]]
[1] "sil"  "2007" "6"  
Run Code Online (Sandbox Code Playgroud)

在最后添加[3]只给我[[3]]结果:"sil""2007""3".我想要的是所有记录的第三部分(唯一编号)的向量.我觉得我已接近理解这一点,但是在截止日期项目上花费了太多时间(就像大多数时间一样).感谢您的任何反馈.

A5C*_*2T1 13

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)
Run Code Online (Sandbox Code Playgroud)

[提取第三个元素的手段.如果您更喜欢矢量,请替换lapplysapply.

这是一个例子:

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"
Run Code Online (Sandbox Code Playgroud)

如果有一个易于定义的模式,gsub也可能是一个不错的选择,并避免分裂.请参阅DWin和Josh O'Brien的改进(更强大)版本的评论.

gsub(".*_.*_(.*)", "\\1", mystring)
# [1] "C" "F"
Run Code Online (Sandbox Code Playgroud)

最后,为了好玩,您可以unlist通过循环使用TRUEs和FALSEs 的向量来提取每个第三个项目(因为我们事先知道所有拆分将导致相同的结构),从而扩展了使其工作的方法.

unlist(strsplit(mystring, "_"), use.names = FALSE)[c(FALSE, FALSE, TRUE)]
# [1] "C" "F"
Run Code Online (Sandbox Code Playgroud)

如果你不是通过数字位置提取,而只是想在分隔符后提取最后一个值,那么你有几个不同的选择.

使用贪婪的正则表达式:

gsub(".*_(.*)", "\\1", mystring)
# [1] "C" "F"
Run Code Online (Sandbox Code Playgroud)

使用类似stri_extract*"stringi"包的便利功能:

library(stringi)
stri_extract_last_regex(mystring, "[A-Z]+")
# [1] "C" "F"
Run Code Online (Sandbox Code Playgroud)