如何用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
相关产品推荐
相关产品推荐

