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

如何用dplyr将含多生存列的宽表转换为带时间列的长表

宽格式生存数据转长格式解决方案

你需要将宽格式的表格(含多列SurvivalX)转换为长格式,保留Temp、Sex、ID三列,新增Time列提取原生存列的后缀数字,Survival列对应原列的值。

原始数据

|Temp | Sex | ID | Survival1 | Surival11 | Survival21 |
|- - -|-----|----|-----------|-----------|------------|
| 30  | Male| 1  |    1      |     1     |     0      |

目标格式

|Temp | Sex | ID | Time | Survival | 
|- - -|-----|----|------|-----------|
| 30  | Male| 1  |  1   |    1      |   
| 30  | Male| 1  |  11  |    1      |
| 30  | Male| 1  |  21  |    0      |

方法1:Excel/Google Sheets 操作(适合小量数据)

  • 复制原始数据行3次,分别对应3个Time值;
  • Time列手动填入1、11、21;
  • Survival列依次引用原始表格的Survival1、Surival11、Survival21单元格的值;
  • 数据量较大时用公式提取Time:针对Survival1表头用=SUBSTITUTE(D$1,"Survival",""),针对Surival11用=SUBSTITUTE(E$1,"Surival",""),下拉即可自动提取数字。

方法2:Python 脚本处理(适合大量数据)

用pandas的melt函数快速转换,代码示例:

import pandas as pd

# 构造或读取原始数据
df = pd.DataFrame({
    'Temp': [30],
    'Sex': ['Male'],
    'ID': [1],
    'Survival1': [1],
    'Surival11': [1],
    'Survival21': [0]
})

# 转长格式
df_melted = df.melt(
    id_vars=['Temp', 'Sex', 'ID'],
    var_name='temp_col',
    value_name='Survival'
)

# 提取Time列的数字,修正原表头拼写错误
df_melted['Time'] = df_melted['temp_col'].str.replace(r'Survival|Surival', '', regex=True)

# 整理列顺序并删除临时列
result = df_melted[['Temp', 'Sex', 'ID', 'Time', 'Survival']]

# 输出markdown格式的结果
print(result.to_markdown(index=False))

运行后直接输出目标格式的表格。

方法3:SQL 查询(数据存储在数据库时)

用UNION ALL拆分每一列:

SELECT Temp, Sex, ID, 1 AS Time, Survival1 AS Survival FROM your_table
UNION ALL
SELECT Temp, Sex, ID, 11 AS Time, Surival11 AS Survival FROM your_table
UNION ALL
SELECT Temp, Sex, ID, 21 AS Time, Survival21 AS Survival FROM your_table;

注意原表头的拼写错误Surival11,SQL语句中要和表结构保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:05:28