使用dplyr将R语言宽数据转换为长数据并添加周次变量
解决方案:用dplyr+tidyr实现宽表转长表
直接使用tidyr::pivot_longer函数可以一次性完成宽格式到长格式的转换,同时提取周数、匹配对应列值,代码如下:
library(dplyr) library(tidyr) # 假设你的原始数据框名为df long_format_df <- df %>% pivot_longer( cols = -ID, # 排除ID列,转换其余所有列 names_to = c(".value", "WEEK"), # .value保留列名前缀作为新列名,WEEK存储提取的周数 names_pattern = "(AI_|activity)(\\d+)", # 正则匹配列名的前缀和数字部分 convert = TRUE # 自动把WEEK的字符类型转为数值类型 ) %>% rename(AI = AI_) # 将AI_列重命名为AI,符合需求
代码解释
cols = -ID:明确只转换除ID之外的列,保留ID作为分组标识names_to = c(".value", "WEEK"):.value是特殊参数,代表将列名中匹配的前缀部分作为新列的名称;WEEK用来存储从列名中提取的数字(1-7)names_pattern:正则表达式(AI_|activity)(\\d+)将列名拆分为两部分:第一部分是AI_或activity(对应新列的名称),第二部分是周数数字convert = TRUE:自动将WEEK列从字符型转为数值型,避免后续分析时类型问题rename(AI = AI_):修正列名,把正则提取得到的AI_改为需求中的AI
结果示例
转换后的数据结构会符合你的预期,示例如下:
| ID | WEEK | AI | activity |
|---|---|---|---|
| 1 | 1 | 10 | walk |
| 1 | 2 | 12 | sit |
| ... | ... | ... | ... |
| 2 | 7 | 20 | sleep |
常见错误排查
如果你的原有代码运行失败,大概率是以下原因:
- 未使用
pivot_longer处理成对列,而是用gather分别转换AI和activity列,导致无法对应周数 - 正则表达式写法错误,无法正确提取列名中的前缀和周数
- 未设置
.value参数,导致列名和值无法正确匹配
内容的提问来源于stack exchange,提问作者Data miner123
相关产品推荐
相关产品推荐

