在R中按不同规则拆分字符串至新列:拆分患者ID与时间点
拆分两种格式的患者ID与时间点字段(R语言实现)
问题场景
你的数据框df中有一列patient_id_and_timepoint,包含两种格式的合并值:
- 空格分隔:例如
"12345 V1"(患者ID为12345,时间点为V1) - 连字符+V开头分隔:例如
"101-123-V1"(患者ID为101-123,时间点为V1)
需要将该列拆分为独立的patient_id和timepoint两列。
原代码存在的问题
你提供的代码有几个明显问题:
- 变量名不统一:混用
patient_id_and_timepoint和patients_id_timepoint,会引发变量未定义错误 str_split_fixed返回矩阵类型,直接赋值给timepoint会导致单元格存储矩阵,不符合列需求- 仅处理了
timepoint,未拆分出patient_id
正确解决方案
使用tidyverse工具包可以简洁实现拆分,步骤如下:
- 构造测试数据(已有真实数据可跳过):
library(tidyverse) df <- tibble( patient_id_and_timepoint = c("12345 V1", "101-123-V1", "6789 V2", "456-789-V3") )
- 执行拆分逻辑:
df_split <- df %>% mutate( # 提取时间点(匹配V+数字的格式) timepoint = str_extract(patient_id_and_timepoint, "V\\d+"), # 根据不同格式提取患者ID patient_id = case_when( str_detect(patient_id_and_timepoint, " V") ~ str_remove(patient_id_and_timepoint, " V\\d+"), str_detect(patient_id_and_timepoint, "-V") ~ str_remove(patient_id_and_timepoint, "-V\\d+") ) ) %>% # 调整列顺序,优先展示拆分后的列 select(patient_id, timepoint, patient_id_and_timepoint)
- 查看拆分结果:
print(df_split)
输出结果:
# A tibble: 4 × 3 patient_id timepoint patient_id_and_timepoint <chr> <chr> <chr> 1 12345 V1 12345 V1 2 101-123 V1 101-123-V1 3 6789 V2 6789 V2 4 456-789 V3 456-789-V3
代码解释
str_extract(patient_id_and_timepoint, "V\\d+"):直接匹配提取所有以V开头、后跟数字的时间点部分,两种格式通用str_detect:判断当前行属于哪种分隔格式str_remove:根据格式去掉对应的时间点后缀,得到纯净的患者ID
内容的提问来源于stack exchange,提问作者lovebead33
相关产品推荐
相关产品推荐

