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

使用SAS将妊娠结局宽格式数据集转换为长格式

宽格式妊娠结局数据集转长格式方案

R语言实现(tidyverse工具链)

利用tidyr包的pivot_longer函数,通过正则表达式匹配列名中的婴儿编号,一次性完成格式转换,完美适配pofid_n和pofnxxx的混合命名规则:

library(tidyverse)

# 假设原始数据集名为df
df_long <- df %>%
  pivot_longer(
    cols = -Patient_ID,  # 保留母亲ID列,其余列参与转置
    names_to = c(".value", "babynumber"),  # .value提取变量通用后缀,babynumber提取婴儿编号
    names_pattern = "pof(?:id_)?(\\d+)(.*)",  # 正则匹配:兼容pofid_1和pof1xxx两种命名
    names_transform = list(babynumber = as.integer)  # 将婴儿编号转为整数类型
  ) %>%
  # 重命名列以匹配目标格式
  rename(
    pofid = id,
    pofpregenddate = pregenddate,
    pofpregendweeks = pregendweeks
  ) %>%
  # 调整列顺序至目标要求
  select(Patient_ID, babynumber, pofid, pofpregenddate, pofpregendweeks)

关键说明

正则表达式pof(?:id_)?(\\d+)(.*)是核心:

  • (?:id_)?匹配可选的id_前缀(兼容pofid_1的格式)
  • (\\d+)提取列名中的婴儿编号(如1、2)
  • (.*)提取变量的通用后缀(如pregenddate)
  • .value参数会自动将后缀相同的列合并为新列,无需手动拆分。

Python语言实现(pandas库)

这里提供两种可行方案,均能处理特殊命名的pofid_n列:

方案1:先统一列名再用wide_to_long

import pandas as pd

# 假设原始数据集名为df
# 先将pofid_n重命名为pof_nid,统一命名格式
df_renamed = df.rename(columns=lambda x: x.replace('pofid_', 'pof_') + 'id' if 'pofid_' in x else x)

# 使用wide_to_long完成转置
df_long = pd.wide_to_long(
    df_renamed,
    stubnames=['pof'],
    i='Patient_ID',
    j='babynumber',
    sep='_',
    suffix='\\d+'
).reset_index()

# 拆分合并的列并调整列名
df_long[['pofid', 'pofpregenddate', 'pofpregendweeks']] = df_long['pof'].apply(pd.Series)
df_long = df_long.drop('pof', axis=1)[['Patient_ID', 'babynumber', 'pofid', 'pofpregenddate', 'pofpregendweeks']]

方案2:用melt+pivot_table处理

import pandas as pd

# 假设原始数据集名为df
# 先将所有列转为长格式
df_melted = df.melt(id_vars='Patient_ID', var_name='variable', value_name='value')

# 正则拆分变量名,提取婴儿编号和变量类型
df_melted[['babynumber', 'var_suffix']] = df_melted['variable'].str.extract(r'pof(?:id_)?(\d+)(.*)')

# 标记变量类型(区分pofid和其他变量)
df_melted['var_type'] = df_melted.apply(
    lambda row: 'pofid' if row['var_suffix'] == '' else f'pof{row["var_suffix"]}',
    axis=1
)

# 透视回宽格式,得到每行对应一个婴儿的数据集
df_long = df_melted.pivot_table(
    index=['Patient_ID', 'babynumber'],
    columns='var_type',
    values='value',
    aggfunc='first'
).reset_index()[['Patient_ID', 'babynumber', 'pofid', 'pofpregenddate', 'pofpregendweeks']]

内容的提问来源于stack exchange,提问作者jackahall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:25:52