You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言中通过模式匹配提取带.1的重复列名及其原列名?

R语言提取带".1"的重复字符串及其原字符串

给定如下R语言向量:

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

需要提取所有末尾带.1的字符串,以及它们对应的原字符串(即去掉.1后的匹配项),最终得到结果:

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

不能直接通过索引提取,这里用模式匹配提供两种可行方案:

方案一:分步筛选

# 提取所有以".1"结尾的元素
dot1_items <- grep("\\.1$", column_names, value = TRUE)
# 从这些元素中提取对应的原字符串(去掉末尾的".1")
original_prefixes <- sub("\\.1$", "", dot1_items)
# 筛选原向量中属于原字符串或带".1"的元素
target_result <- column_names[column_names %in% c(original_prefixes, dot1_items)]
# 保持元素在原向量中的出现顺序
target_result <- target_result[order(match(target_result, column_names))]

print(target_result)

逻辑说明

  • grep("\\.1$", ...):用正则匹配结尾是.1的元素,\\.用来转义点号(避免被当作任意字符),$表示匹配字符串末尾。
  • sub("\\.1$", "", ...):将带.1的元素末尾的.1替换为空,得到对应的原字符串。
  • 最后通过%in%筛选目标元素,并用match保持原向量中的顺序。

方案二:构建正则模式直接匹配

# 先获取所有带".1"元素的前缀
prefixes <- sub("\\.1$", "", grep("\\.1$", column_names, value = TRUE))
# 构建正则模式:匹配前缀本身,或者前缀加".1"结尾
match_pattern <- paste0("^(", paste(prefixes, collapse = "|"), ")(\\.1)?$")
# 直接筛选符合模式的元素
target_result <- grep(match_pattern, column_names, value = TRUE)
# 保持原顺序
target_result <- target_result[order(match(target_result, column_names))]

print(target_result)

逻辑说明

  • 先提取所有带.1元素的前缀,然后构建一个正则模式,该模式会匹配前缀本身,或者前缀加上.1的结尾字符串。
  • 用grep直接筛选符合模式的元素,最后调整顺序保持原向量中的出现顺序。

内容的提问来源于stack exchange,提问作者ZT_Geo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:05:28