R语言数据框中相似字符串行的识别与合并方法咨询
在R语言中识别并合并表述相似的疾病行
当然有办法啦!针对你遇到的这种疾病名称表述略有差异但实质相同的情况,我们可以通过文本标准化+分组合并的思路来解决,甚至可以用模糊聚类处理更复杂的场景,下面是具体的实现步骤:
一、明确差异模式,先做文本标准化
你的例子里主要是两种差异:96+ 和 >96 的符号替换,以及 HRS 和 HOURS 的缩写差异。我们可以先把这些不一致的表述统一成标准格式,这样就能轻松识别出实质相同的行。
实现代码:
首先加载常用的文本处理和数据操作包,然后定义一个标准化函数:
library(dplyr) library(stringr) # 自定义文本标准化函数,可根据你的实际数据扩展 standardize_disease <- function(text) { text %>% # 把 ">数字" 格式替换成 "数字+"(比如 >96 → 96+) str_replace_all(">(\\d+)", "\\1+") %>% # 统一缩写:把 HRS 替换成 HOURS(反之亦可,看你需求) str_replace_all("\\bHRS\\b", "HOURS") %>% # 去除多余的连续空格,保证格式统一 str_squish() } # 假设你的数据框是 df,疾病名称列叫 disease_name df <- df %>% mutate(standardized_disease = standardize_disease(disease_name))
二、按标准化后的文本分组合并
标准化完成后,所有实质相同的疾病名称会变成完全一致的文本,接下来就可以按这个标准列分组,合并你需要的其他数据列(比如计数、数值指标等)。
实现代码:
# 合并行,这里以求和数值列 count 为例,可根据需求调整 merged_df <- df %>% group_by(standardized_disease) %>% summarise( # 保留所有原始的差异表述,方便核对 original_variants = paste(unique(disease_name), collapse = "; "), # 合并数值列:比如求和计数 total_count = sum(count, na.rm = TRUE), # 如果有其他列,比如日期、分类,可按需处理(比如取第一个或合并) .groups = "drop" )
三、复杂场景:用模糊聚类处理未知差异模式
如果你的数据里还有很多不确定的表述差异(比如不同的缩写、语序变化),可以用文本距离+聚类的方法自动识别相似文本。
实现代码:
library(stringdist) library(cluster) # 计算疾病名称之间的文本距离(用Jaccard距离,适合短文本匹配) dist_matrix <- stringdistmatrix(df$disease_name, method = "jaccard") # 用层次聚类对相似文本分组 hc <- hclust(as.dist(dist_matrix), method = "ward.D2") # 可以先画树状图,观察聚类的合适阈值 # plot(hc, cex = 0.6) # 设定距离阈值(比如0.1,值越小要求越相似),生成聚类ID df <- df %>% mutate(cluster_id = cutree(hc, h = 0.1)) # 按聚类ID合并行 merged_df_clustered <- df %>% group_by(cluster_id) %>% summarise( # 取标准化后的第一个文本作为代表 representative_disease = first(standardized_disease), # 列出所有原始表述 all_variants = paste(unique(disease_name), collapse = "; "), total_count = sum(count, na.rm = TRUE), .groups = "drop" )
注意事项
- 标准化函数可以根据你的实际数据扩展:比如还有其他符号(如
-和–)、缩写(如MV对应的全称),都可以加入替换规则; - 合并数值列时,要根据业务需求选择合适的聚合方式:求和、取均值、保留所有原始值都可以;
- 模糊聚类的阈值需要调整:可以通过树状图观察聚类分支的高度,找到能区分不同疾病的合适阈值。
内容的提问来源于stack exchange,提问作者Zoshua Colah
相关产品推荐
相关产品推荐

