R语言如何按行将字符串转为向量 实现诊断编码逐行匹配
问题原因
之前的处理思路存在两个核心问题:
- 直接对整列
discharge_codes调用str_split()后接flatten_chr(),会把所有行拆分出的诊断编码全部合并成一个全局字符向量,完全丢失行与行的患者对应关系,自然无法实现逐患者匹配。 - 用
rowwise()按行处理时报错,是因为str_split()处理单行字符串时,输出本身就是拆分完成的字符向量(嵌套在长度为1的列表元素里),而flatten_chr()要求输入必须是多层嵌套的列表结构,传入字符向量就会触发.x must be a list, not a character vector的类型错误。
简便实现方案
不需要复杂的扁平化操作,两种常用写法都可以快速实现需求:
方法1:正则精确匹配(代码最简洁)
不需要拆分字符串,直接构造精确匹配的正则规则即可,必须加起止和分隔符边界判断,避免短编码被长编码误判(比如编码"A"误匹配到"AB"):
library(tidyverse) mre %>% mutate( is_code_exist = str_detect(discharge_codes, paste0("(^|_)", follow_up_code, "(_|$)")) )
运行结果对应示例数据:
- 患者1234:随访编码A存在于出院编码A_B_C中,返回
TRUE - 患者4567:随访编码C不存在于出院编码D_E_F中,返回
FALSE - 患者7890:随访编码E存在于出院编码A_C_E中,返回
TRUE
方法2:逐行拆分判断(逻辑最直观)
如果不想写正则,可以利用str_split()输出的列表列结构,用map2_lgl()逐行做成员判断,不会出现全局扁平化的问题:
mre %>% mutate( is_code_exist = map2_lgl( discharge_codes, follow_up_code, ~ .y %in% str_split(.x, "_")[[1]] ) )
之前的
rowwise()写法其实只需要去掉多余的flatten_chr()调用就能正常运行,不需要额外做格式转换:mre %>% rowwise() %>% mutate(is_code_exist = follow_up_code %in% str_split(discharge_codes, "_")[[1]]) %>% ungroup()
内容的提问来源于stack exchange,提问作者Nickopotamus
相关产品推荐
相关产品推荐

