基于含序号的列名在R中将数据框转换为长格式
宽格式数据转长格式(多组变量带序号)
针对你的需求,不需要写循环,用tidyr包的pivot_longer函数可以高效完成宽转长操作,自动识别带序号的变量组:
步骤1:加载依赖包
library(tidyr)
步骤2:执行宽转长转换
df_tomake <- df_asis %>% pivot_longer( cols = -ID, # 排除ID列,处理其余所有列 names_to = c(".value", "observation"), # .value保留原变量名作为列,observation存储分组序号 names_sep = "\\." # 按点号分割列名(点是正则特殊字符,需转义) ) %>% select(-observation) # 不需要序号列则删除
这段代码会自动把Age/Age.1/Age.2合并为一列Age,Gender系列和Code系列同理,最终每个ID对应多行观测,和你给出的目标数据框完全一致。该方法无需手动指定组数(哪怕是51组也能自动处理),只要列名符合变量名.序号格式即可正常工作。
Base R替代方案(无需tidyverse)
如果不能加载外部包,可以用base R的reshape函数:
# 计算变量组数:总变量数(除ID)除以每组变量个数(此处为3) group_count <- (ncol(df_asis) - 1) / 3 df_tomake_base <- reshape( df_asis, direction = "long", varying = names(df_asis)[-1], v.names = c("Age", "Gender", "Code"), idvar = "ID", timevar = "observation", times = 0:(group_count - 1) ) %>% select(-observation) %>% arrange(ID)
这个方法需要手动指定变量名(v.names)和计算组数,适合无法加载外部包的场景。
内容的提问来源于stack exchange,提问作者zhg
相关产品推荐
相关产品推荐

