You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于变量名后缀将多列宽格式DataFrame转换为长格式

宽格式DataFrame转长格式解决方案

针对你这种多组测量数据的宽转长需求,推荐使用R的tidyverse包中的pivot_longer函数,它可以高效处理有规律命名的多列转换:

核心代码

library(tidyverse)

# 执行宽转长转换
df_long <- df %>%
  pivot_longer(
    cols = -c(Subject, date),  # 保留标识符列:Subject和date
    names_to = c("Measure", ".value"),  # 拆分列名为「测量指标」和「属性列名」
    names_sep = "_",  # 用下划线作为列名拆分符
    values_drop_na = FALSE  # 保留NA值(按需调整为TRUE可删除含NA的行)
  )

关键参数说明

  • cols = -c(Subject, date):指定无需转换的列,这些列会作为每个长格式行的基础标识。
  • names_to = c("Measure", ".value"):
    • Measure:生成新列存储测量指标名称(如VSWGT、VSHT、VSRRATE、VSSYSBP)。
    • .value:将原列名的后缀部分(如RAW、UN、STD)转换为新的属性列,对应的值自动填充到这些列中。
  • names_sep = "_":依据下划线拆分原列名,完美匹配你数据中指标_属性的命名规律。

结果说明

转换后的数据结构完全匹配你的理想输出:

  • 每个Subject+date组合下,生成对应所有测量指标的行。
  • 每个测量指标的行中,仅对应属性列有值(如VSWGT行填充RAW/UN/STD/STD_UN列,VSSYSBP行填充VSSYSBP列),其余列显示NA。

可选整理(按需使用)

如果希望把VSSYSBP的数值统一放到RAW列,可以追加以下代码:

df_long_clean <- df_long %>%
  mutate(RAW = ifelse(Measure == "VSSYSBP", as.character(VSSYSBP), RAW)) %>%
  select(-VSSYSBP) %>%
  arrange(Subject, date, Measure)

内容的提问来源于stack exchange,提问作者Stataq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:27:17