R语言dplyr实现数据框宽转长并添加周序号变量的方法
R/dplyr 宽转长并添加周编号实现方案
基于你已生成的AI_mean长表追加周编号
你当前得到的长表已经按患者分组,每个ID下固定按x1到x7的顺序排列7条记录,直接分组生成行号即可匹配周序号,代码如下:
library(dplyr) AI_mean_updated <- AI_mean %>% group_by(PATIENT) %>% # 需要1-7的序号直接取行号,需要你最开始提到的0-6序号就改成 row_number() - 1 mutate(WEEK = row_number()) %>% ungroup()
这个方法逻辑简单,不需要修改你之前的转换代码,只要最后加一步分组计算行号就行,因为pivot_longer默认会保留原列的排列顺序,不会出现周数错位的问题。
一次性完成全指标宽转长+周编号生成(推荐)
你之前只单独提取了AI_mean相关列做转换,实际上可以一次性处理AI_mean/MAD_mean/SD_mean/ENMO_t_mean四类指标,同时直接从原列名提取周数,避免多次转表的麻烦,准确率更高:
library(dplyr) library(tidyr) library(readr) # 原始宽表替换为你自己的表名即可 long_all <- raw_df %>% # 保留患者ID,选中所有带mean后缀的指标列 select(PATIENT, ends_with("mean")) %>% pivot_longer( cols = -PATIENT, # 按列名里的.拆分,前半段是x+周数,后半段是指标名 names_to = c("week_tag", "metric_name"), names_sep = "\\.", values_to = "metric_value", values_drop_na = TRUE # 和你之前代码的空值处理逻辑保持一致 ) %>% mutate( # 从x1/x2...字段里提取数字作为周编号 WEEK = parse_number(week_tag), # 要0-6的周序号就改成 WEEK = parse_number(week_tag) - 1 week_tag = NULL # 删除临时拆分的周数字段 ) %>% # 把不同指标展开为独立列,得到最终规整表 pivot_wider( names_from = metric_name, values_from = metric_value )
内容的提问来源于stack exchange,提问作者Data miner123
相关产品推荐
相关产品推荐

