使用pivot_longer时如何为新增行生成新ID并添加至现有ID列
问题描述
我正在使用tidyverse中的pivot_longer将宽格式数据重构为长格式。现有数据每行包含一个ID列,但转换为长格式后会新增行,我希望为这些新增行生成新ID并替换原ID列。
原始简化数据
| ID | Census | Tab1 | Tab2 | Tab3 |
|---|---|---|---|---|
| 1 | t1 | 1 | 0 | 1 |
| 2 | t1 | 1 | 0 | 1 |
| 3 | t1 | 0 | 0 | 0 |
| 4 | t2 | 1 | 1 | 0 |
| 5 | t2 | 1 | 1 | 0 |
| 6 | t2 | 1 | 1 | 0 |
期望转换后的长格式数据
| ID | Census | Tab_ID | Score |
|---|---|---|---|
| 1 | t1 | 1 | 1 |
| 1001 | t1 | 2 | 0 |
| 2001 | t1 | 3 | 1 |
| 2 | t1 | 1 | 1 |
| 1002 | t1 | 2 | 0 |
| 2002 | t1 | 3 | 1 |
我已完成转长操作,但不知道如何为新增行生成新ID,当前代码:
long <- df %>% pivot_longer(cols = 3:5, names_to = 'Tab_ID', names_prefix = "Tab", values_to = 'Score')
解决方案
观察你期望的ID生成规则:原ID + (Tab_ID - 1) * 1000,对应逻辑:
- Tab_ID=1时,ID保留原始值
- Tab_ID=2时,ID为
1000 + 原ID - Tab_ID=3时,ID为
2000 + 原ID
基于这个规则,在转长后添加ID计算逻辑即可,修改后的完整代码:
library(tidyverse) long <- df %>% pivot_longer(cols = 3:5, names_to = 'Tab_ID', names_prefix = "Tab", values_to = 'Score') %>% # 将Tab_ID转换为整数类型,确保计算正常 mutate(Tab_ID = as.integer(Tab_ID), # 按规则生成新ID ID = ID + (Tab_ID - 1) * 1000)
说明
pivot_longer环节保留你原有的逻辑,通过names_prefix自动去除Tab前缀,得到纯数字的Tab_ID- 转换Tab_ID为整数是为了避免字符型数据无法参与算术运算
- 如果后续ID生成规则有调整,只需修改
ID = ...中的计算表达式即可适配
内容的提问来源于stack exchange,提问作者Saskia
相关产品推荐
相关产品推荐

