如何在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
相关产品推荐
相关产品推荐

