如何在R中识别字符串内指定词汇的出现顺序,替代Excel手动操作?
问题
现有一份包含20000+条客户数据的Excel表格,此前通过Excel公式(如=MIN(D2:G2)、=IFERROR(LEN(LEFT($B2,FIND(D$1,$B2))),""))计算指定词汇在备注内容字段中的出现位置,以此返回最早出现的词汇,但手动操作繁琐、效率低下,希望迁移至R环境实现相同功能。
指定目标词汇:growth check、growth、weight、feeding
输入数据示例
| 客户ID | 备注内容 |
|---|---|
| 001 | The client had weight taken, showed growth with good feeding |
| 002 | A growth check was conducted |
| 003 | Growth and weight taken |
期望输出
| 客户ID | 备注内容 | 优先级1词汇 | 优先级2词汇 | 优先级3词汇 |
|---|---|---|---|---|
| 001 | the client had weight taken, showed growth with good feeding | weight | growth | feeding |
| 002 | a growth check was conducted | growth check | NA | NA |
| 003 | growth and weight taken | growth | weight | NA |
R实现方案
1. 加载依赖包
使用tidyverse处理数据与字符串,readxl读取Excel文件:
# 首次使用需安装包 install.packages(c("tidyverse", "readxl")) # 加载包 library(tidyverse) library(readxl)
2. 导入数据
如果是本地Excel文件,直接读取;示例数据可手动构造:
# 示例数据构造 client_data <- tibble( 客户ID = c("001", "002", "003"), 备注内容 = c( "The client had weight taken, showed growth with good feeding", "A growth check was conducted", "Growth and weight taken" ) ) # 读取本地Excel文件(替换为你的文件路径) # client_data <- read_excel("客户数据.xlsx")
3. 核心逻辑实现
编写函数提取每条备注中词汇的出现顺序,注意长词汇需放在对应短词汇前(避免growth先匹配growth check中的片段):
# 目标词汇列表(顺序至关重要) target_words <- c("growth check", "growth", "weight", "feeding") # 定义获取词汇优先级的函数 get_word_priority <- function(note_text) { # 统一转为小写,消除大小写匹配差异 note_lower <- str_to_lower(note_text) # 计算每个词汇的起始出现位置,未找到则为NA word_positions <- map_dbl(target_words, ~str_locate(note_lower, .x)[1, 1]) # 按出现位置排序,过滤未找到的词汇,取前3个 sorted_words <- target_words[order(word_positions)] %>% discard(is.na) %>% head(3) # 补全至3个元素,不足的用NA填充 length(sorted_words) <- 3 return(sorted_words) }
4. 应用函数并整理输出
将函数批量应用到数据中,拆分结果为优先级列:
client_data <- client_data %>% mutate(词汇优先级 = map(备注内容, get_word_priority)) %>% unnest_wider(词汇优先级, names_sep = "") %>% rename( 优先级1词汇 = 词汇优先级1, 优先级2词汇 = 词汇优先级2, 优先级3词汇 = 词汇优先级3 ) # 查看最终结果 print(client_data)
运行后即可得到与期望一致的输出,处理2万+条数据的效率远高于手动Excel操作。
内容的提问来源于stack exchange,提问作者user19779614
相关产品推荐
相关产品推荐

