如何移除R语言字符向量中的重复元素?多场景实操问询
解决字符串重复术语(含长短语)的去重问题
嘿,我来帮你搞定这两个字符串去重的问题~ 针对你遇到的两种场景,我分别整理了靠谱的解决方法:
场景1:带标点的短术语重复(如BMI, 和BMI.)
你之前用unique()失败是因为标点导致字符串被判定为不同内容,我们可以用正则直接匹配重复的术语,同时调整格式(比如把height(female)改成height (female)):
library(stringr) # 原字符串 s <- "height(female), weight, BMI, and BMI." # 第一步:修正height(female)为height (female)的格式 s_formatted <- str_replace(s, "(\\w+)(\\(.*?\\))", "\\1 \\2") # 第二步:去除重复的BMI,保留正确的"and"结构 result <- str_replace(s_formatted, "(?<=,\\s)(\\w+)([.,])\\s+and\\s+\\1([.,])", "and \\1\\3") print(result) # 输出:"height (female), weight, and BMI."
正则说明:
(?<=,\\s):正向预查,确保匹配的内容前面是,,避免误匹配开头的术语(\\w+)([.,]):捕获核心术语(比如BMI)和它后面的标点\\s+and\\s+:匹配术语之间的"and"和空格\\1([.,]):匹配重复的核心术语和它的标点- 替换为
and \\1\\3:保留正确的"and + 术语"结构,同时用最后一个术语的标点
场景2:长短语的重复(如body mass index)
你之前的正则没生效是因为没有正确匹配多词短语的重复,我们可以用「拆分-标准化-去重-重构」的思路,这个方法既兼容短术语也兼容长短语:
library(stringr) # 原字符串 s <- "height (female), weight, weight, body mass index, body mass index." # 1. 按", "拆分字符串为单个术语 terms <- str_split(s, ",\\s+")[[1]] # 2. 标准化术语:去掉末尾标点、修剪空格,方便判断重复 standardized_terms <- str_trim(str_remove(terms, "[.,]$")) # 3. 筛选出不重复的术语(保留第一次出现的) unique_terms <- terms[!duplicated(standardized_terms)] # 4. 重构符合英文表达的句子:最后一个术语前加"and" if (length(unique_terms) > 1) { last_term <- unique_terms[length(unique_terms)] other_terms <- unique_terms[-length(unique_terms)] result <- paste(paste(other_terms, collapse = ", "), last_term, sep = ", and ") } else { result <- unique_terms } print(result) # 输出:"height (female), weight, and body mass index."
思路说明:
- 拆分术语:把长句子拆成独立的元素,方便逐个处理
- 标准化:统一去掉末尾的标点,避免因为标点不同被判断为不同术语
- 去重:用
duplicated()找出重复的术语,只保留第一次出现的 - 重构句子:按照英文的表达习惯,在最后一个术语前加上"and",让句子更自然
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

