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

使用dplyr的pivot_wider将血糖长表转宽表出现警告如何处理?

R长格式血糖重复测量数据转宽格式解决方案

报错原因

警告的核心触发逻辑为:同一ID存在多条重复测量记录,无单独列标识测量顺序,pivot_wider无法匹配多值与列的对应关系,因此默认生成列表列。需先为每个ID的测量记录添加观测序号,再执行宽转换。

实现代码

# 加载依赖包
library(tidyverse)

lab_gluc_wide <- mydata %>%
  # 按ID分组,按日期排序后生成测量序号,无需排序可直接写mutate(obs_num = row_number())
  group_by(ID) %>%
  arrange(date, .by_group = TRUE) %>%
  mutate(obs_num = row_number()) %>%
  ungroup() %>%
  # 宽转换
  pivot_wider(
    id_cols = ID,
    names_from = obs_num,
    values_from = c(date, value),
    # 可自定义列名格式,修改后列名为date_1、gluc_1、date_2、gluc_2...
    names_glue = "{ifelse(.value == 'date', 'date', 'gluc')}_{obs_num}"
  )

输出说明

转换后的数据每行对应唯一患者ID,列按测量顺序排序,依次为每次测量的日期、血糖值,测量次数少于最大次数的患者对应列自动填充为NA。
如果需要对同一天的多次测量做聚合(比如取均值),可以在分组后先聚合再生成序号:

# 同一天多次测量取均值的版本
lab_gluc_wide_agg <- mydata %>%
  group_by(ID, date) %>%
  summarise(value = mean(value, na.rm = TRUE), .groups = "drop_last") %>%
  arrange(date, .by_group = TRUE) %>%
  mutate(obs_num = row_number()) %>%
  ungroup() %>%
  pivot_wider(
    id_cols = ID,
    names_from = obs_num,
    values_from = c(date, value),
    names_glue = "{ifelse(.value == 'date', 'date', 'gluc')}_{obs_num}"
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:39:00