You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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工具包可以简洁实现拆分,步骤如下:

  1. 构造测试数据(已有真实数据可跳过):
library(tidyverse)

df <- tibble(
  patient_id_and_timepoint = c("12345 V1", "101-123-V1", "6789 V2", "456-789-V3")
)
  1. 执行拆分逻辑:
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)
  1. 查看拆分结果:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:05:04