如何在R语言中将两列测量值合并为一列并生成标识列?
宽表转长表实现方案
输入数据
| patient_id | time | measurement1 | cov1 | measurement2 |
|---|---|---|---|---|
| 1 | 0 | 257 | 67 | 0,12 |
| 1 | 5 | 10 | 67 | 62 |
| 2 | 0 | 295 | 80 | 0,18 |
| 2 | 3 | 60 | 80 | 231 |
期望输出
| patient_id | time | measurements | m_id | cov1 |
|---|---|---|---|---|
| 1 | 0 | 257 | 1 | 67 |
| 1 | 0 | 0,12 | 2 | 67 |
| 1 | 5 | 10 | 1 | 67 |
| 1 | 5 | 62 | 2 | 67 |
| 2 | 0 | 295 | 1 | 80 |
| 2 | 0 | 0,18 | 2 | 80 |
| 2 | 3 | 60 | 1 | 80 |
| 2 | 3 | 231 | 2 | 80 |
实现方法
方法1:Python Pandas
使用melt函数快速实现宽表转长表,代码如下:
import pandas as pd # 构造输入数据 df = pd.DataFrame({ 'patient_id': [1, 1, 2, 2], 'time': [0, 5, 0, 3], 'measurement1': [257, 10, 295, 60], 'cov1': [67, 67, 80, 80], 'measurement2': ['0,12', 62, '0,18', 231] }) # 执行宽转长操作 melted_df = df.melt( id_vars=['patient_id', 'time', 'cov1'], value_vars=['measurement1', 'measurement2'], value_name='measurements' ) # 生成m_id标识列 melted_df['m_id'] = melted_df['variable'].apply(lambda x: 1 if x == 'measurement1' else 2) # 调整列顺序并清理临时列 result_df = melted_df[['patient_id', 'time', 'measurements', 'm_id', 'cov1']] # 查看结果 print(result_df)
方法2:SQL
通过UNION ALL合并两个查询结果,分别提取两类测量值:
SELECT patient_id, time, measurement1 AS measurements, 1 AS m_id, cov1 FROM your_table UNION ALL SELECT patient_id, time, measurement2 AS measurements, 2 AS m_id, cov1 FROM your_table ORDER BY patient_id, time, m_id;
注意:将your_table替换为实际数据表名。
内容的提问来源于stack exchange,提问作者Anna-Kristina
相关产品推荐
相关产品推荐

