我有'aaa_9999_1'形式的数据向量,其中第一部分是alpha位置代码,第二部分是四位数年份,而final是唯一的点标识符。例如,有多个sil_2007_X点,每个点具有不同的最后一位数。我需要使用“_”字符拆分此字段,并仅将唯一ID号保存到新矢量中。我试过了:
oss$point <- unlist(strsplit(oss$id, split='_', fixed=TRUE))[3]
基于此处的回复:R remove part of string。 我收到“1”的单一回复。如果我只是运行
strsplit(oss$id, split= ‘_’, fixed=TRUE)
我可以生成拆分列表:
> 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"
在最后添加[3]只给我[[3]]结果:“sil”“2007”“3”。我想要的是所有记录的第3部分(唯一编号)的向量。我觉得我已接近理解这一点,但是在截止日期项目上花费了太多时间(就像大多数时间一样)。感谢您的任何反馈。
答案 0 :(得分:12)
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)
[
表示提取第三个元素。如果您更喜欢矢量,请将lapply
替换为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
和FALSE
s的向量来提取每个第三项(因为我们事先知道所有的分裂都会产生相同的结构。)
unlist(strsplit(mystring, "_"), use.names = FALSE)[c(FALSE, FALSE, TRUE)]
# [1] "C" "F"
如果您不是通过数字位置提取,而只是想在分隔符后提取最后一个值,那么您有几个不同的选择。
使用贪婪的正则表达式:
gsub(".*_(.*)", "\\1", mystring)
# [1] "C" "F"
使用“stringi”包中的stri_extract*
等便利功能:
library(stringi)
stri_extract_last_regex(mystring, "[A-Z]+")
# [1] "C" "F"
答案 1 :(得分:0)
这是你需要的吗?
x = c('aaa_9999_12', 'bbb_9999_20')
ids = sapply(x, function(v){strsplit(v, '_')[[1]][3]}, USE.NAMES = FALSE)
# optional
# ids = as.numeric(ids)
这非常低效,可能有更好的方法。