我有此Identifier
列
structure(list(Identifier = c("NC.1.OA", "NC.1.OA.0", "NC.1.OA.1",
"NC.1.OA.1.a", "NC.1.OA.1.b", "NC.1.OA.1.c", "NC.1.OA.2", "NC.1.OA.2.0",
"NC.1.OA.3", "NC.1.OA.4", "NC.1.OA.4.0", "NC.1.OA.9", "NC.1.OA.6",
"NC.1.OA.6.a", "NC.1.OA.6.b", "NC.1.OA.6.c", "NC.1.OA.6.d", "NC.1.OA.6.e",
"NC.1.OA.6.f", "NC.1.OA.6.f.0", "NC.1.OA.7", "NC.1.OA.8")), row.names = c(NA,
-22L), class = c("tbl_df", "tbl", "data.frame"))
我想从此列中提取NC.1.OA
。通常,这将提取从开始到第三个时段的所有内容,但是第一行会违反该规则,因为只有两个时段。
我尝试了gsub(".*\\.(.*)\\..*", "\\1", Identifier)
,没有雪茄。
答案 0 :(得分:0)
我们可以使用str_extract
library(tidyverse)
df %>%
mutate(new = str_extract(Identifier, "NC\\.1\\.OA"))
此外,如果我们使用的是sub
(因为我们不需要全局替换,则不需要gsub
),请使用位置标识符进行修复,以将字符串的开头(^
)通知。在下面的模式中,我们匹配一个不是.
([^.]+
)的字符,然后是.
([.]
-点是一个元字符,因此我们进行了转义或将其放在方括号中以按字面值求值),然后再加上一个数字(\\d+
),然后是.
和不是点的字符(如前所述),作为一个组捕获(用方括号括起来) ),并在替换中使用捕获组的后向引用(\\1
)
sub("^([^.]+[.]\\d+[.][^.]+).*", "\\1", df$Identifier)
#[1] "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA"
#[12] "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA"