R语言 字符串中除最后两个元素外的所有元素都相同时的模式匹配

nxowjjhe  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(139)

我有下面的向量。

column_names <- c("6Li", "7Li", "10B", "11B", "7Li.1",
                  "205Pb", "206Pb", "207Pb", "238U",
                  "206Pb.1", "238U.1")

注意,有些值只是重复的,末尾有一个“.1”,我想索引出所有这些字符串沿着它们对应的匹配字符串,这样就只返回以下内容。

#[1] "7Li"     "7Li.1"   "206Pb"   "238U"    "206Pb.1" "238U.1"

假设你不知道索引的位置,所以你不能简单地索引这些值如下column_names[c(2,5,7,9,10,11)],我如何使用模式匹配来提取这些值?

6jygbczu

6jygbczu1#

可能有一个更优雅的解决方案,但在基R中,您可以尝试grep/gsubpaste的组合:

idx <- grep(paste(gsub("\\.1", "", column_names[grep("\\.1", column_names)]), collapse = "|"), column_names)
# [1]  2  5  7  9 10 11

column_names[idx]
# [1] "7Li"     "7Li.1"   "206Pb"   "238U"    "206Pb.1" "238U.1"
pbossiut

pbossiut2#

使用gsub()duplicated()查找具有重复词干的值:

column_stems <- gsub("\\.1", "", column_names)

dup_idx <- duplicated(column_stems) | duplicated(column_stems, fromLast = TRUE)

column_names[dup_idx]
# "7Li"     "7Li.1"   "206Pb"   "238U"    "206Pb.1" "238U.1"

要同时查找以.2.3等结尾的示例,请在gsub()中使用"\\.\\d+"而不是"\\.1"

vbopmzt1

vbopmzt13#

您可以使用stringr

library(stringr)

idx <- str_extract(column_names, ".*(?=\\.1)")

column_names[str_detect(column_names, paste(idx[!is.na(idx)], collapse = "|"))]

这将返回

#> [1] "7Li"     "7Li.1"   "206Pb"   "238U"    "206Pb.1" "238U.1"

相关问题