R语言中跨列拆分列表如何识别目标词对应的模式匹配索引
问题根源与正确实现
原代码的失效原因
现有代码无报错但返回空结果,核心是逻辑存在三层错位:
- 遍历对象错误:
lapply(df_test[,3:4], ...)是逐列遍历两个拆分后的整列,没有实现同一行内转写拆分向量、词性拆分向量的配对处理 - 匹配层级错误:函数内部
which(df_test[,3]=="gon")是拿整列的列表结构直接和字符串"gon"做等值比较,定位的是列维度的行号,而非单句内的词元位置 - 匹配逻辑冗余:同一句的转写文本与词性标注按相同空格规则拆分后,天然是等长、同位置一一对应的关系,不需要额外做跨向量的
match操作。原代码传入match的待匹配值、待匹配序列分属不同层级的维度,根本无法建立有效映射
正确实现方案
核心逻辑:逐行取当前行的转写拆分向量,定位gon在该向量内的索引,该索引值就是对应词性列的目标位置——因为两个拆分序列的位置是严格对齐的。
基础R版本实现
直接用mapply完成逐对匹配,同时增加长度校验,避免拆分错位导致的结果偏差:
df_test$Index_matches <- mapply( function(turn_vec, c5_vec) { # 校验两个拆分向量长度一致,排除拆分规则不一致导致的位置错位 stopifnot(length(turn_vec) == length(c5_vec)) # 定位当前行转写中"gon"的位置索引 which(turn_vec == "gon") }, df_test$Turns_split, df_test$c5_split )
运行结果完全符合预期:
- 第一行数据返回索引值4,对应位置转写为
gon,同位置词性标注为VVG - 第二行数据返回索引值3,对应位置转写为
gon,同位置词性标注为VVG
如果后续需要直接获取gon对应的词性标注值,只需在定位索引后直接索引同 row 的c5_vec即可,如c5_vec[which(turn_vec == "gon")],可直接返回对应的词性标签VVG。
Tidyverse风格实现
如果使用purrr迭代工具,可通过更简洁的写法实现相同效果:
library(dplyr) library(purrr) df_test <- df_test %>% mutate( # map2_dbl逐对遍历两个拆分列表列,直接返回数值型索引存入新列 Index_matches = map2_dbl(Turns_split, c5_split, ~ which(.x == "gon")) )
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

