如何用另一列匹配的完整名称替换首字母缩写(保留特定缩写)?
R语言数据框缩写替换实现方案
原始数据
给定如下R语言数据框:
data <- data.frame( name = c("Acorus americanus", "Nothocalais cuspidata", "Elymus repens", "Elymus hmmmm", "Acorus americanus"), synonym = c("A. calamus", "Agoseris cuspidata", "Agropyron r.", "Elymus sp.", "S. americanus") )
输出结果:
name synonym 1 Acorus americanus A. calamus 2 Nothocalais cuspidata Agoseris cuspidata 3 Elymus repens Agropyron r. 4 Elymus hmmmm Elymus sp. 5 Acorus americanus S. americanus
需求说明
需要对synonym列执行以下替换规则:
- 将单个字母加句号的首字母缩写,替换为对应行
name列中首字母匹配的完整单词 - 保留
sp.、var.、ssp.这类固定缩写,不做替换 - 若
name列中没有首字母匹配的单词,保留原缩写
期望结果
处理后的数据框如下:
name synonym 1 Acorus americanus Acorus calamus 2 Nothocalais cuspidata Agoseris cuspidata 3 Elymus repens Agropyron repens 4 Elymus hmmmm Elymus sp. 5 Acorus americanus S. americanus
解决方案
可以结合dplyr和stringr包实现需求,代码如下:
library(dplyr) library(stringr) # 原始数据 data <- data.frame( name = c("Acorus americanus", "Nothocalais cuspidata", "Elymus repens", "Elymus hmmmm", "Acorus americanus"), synonym = c("A. calamus", "Agoseris cuspidata", "Agropyron r.", "Elymus sp.", "S. americanus") ) # 定义无需替换的特殊缩写集合 keep_abbr <- c("sp.", "var.", "ssp.") # 自定义缩写替换函数 replace_abbr <- function(name_str, synonym_str) { # 拆分当前行name字段的所有单词 name_words <- str_split(name_str, "\\s+")[[1]] # 匹配所有单个字母加句号的独立缩写 matches <- str_extract_all(synonym_str, "\\b[A-Za-z]\\.(?!\\w)")[[1]] for (abbr in matches) { # 跳过需要保留的特殊缩写 if (abbr %in% keep_abbr) next # 提取缩写的首字母 first_char <- str_sub(abbr, 1, 1) # 从name的单词中筛选首字母匹配的项 match_word <- name_words[str_sub(name_words, 1, 1) == first_char] # 找到匹配项则替换缩写 if (length(match_word) > 0) { synonym_str <- str_replace_all(synonym_str, fixed(abbr), match_word[1]) } } return(synonym_str) } # 逐行应用替换函数生成结果 result <- data %>% mutate(synonym = mapply(replace_abbr, name, synonym)) # 打印结果 print(result)
代码说明
keep_abbr:维护不需要替换的固定缩写列表,可根据实际需求扩展replace_abbr函数:逐行处理每一对name和synonym,先拆分name的单词,再识别目标缩写,匹配到对应单词后完成替换mapply:实现逐行传递name和synonym的值给处理函数,确保每行的替换基于自身的name字段
内容的提问来源于stack exchange,提问作者ifoxfoot
相关产品推荐
相关产品推荐

