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

R语言基于唯一ID与时间戳创建新数据框的实现问题

R语言实现多就诊记录按用户ID转宽表

核心逻辑

按用户ID分组后,先对就诊时间升序排序,为同一用户的所有就诊记录生成就诊序号,提取前2次就诊的优先级后转宽表即可。

方法1:tidyverse 实现(代码逻辑清晰易读)

# 加载依赖包,未安装可先运行 install.packages("tidyverse")
library(tidyverse)

# 数据处理
result <- data %>%
  group_by(ID) %>%
  # 同一用户下按就诊时间从早到晚排序
  arrange(TIME, .by_group = TRUE) %>%
  # 生成就诊次序号,作为后续宽表列名
  mutate(visit_seq = paste0("PRIORITY ", row_number())) %>%
  # 仅保留前2次就诊记录,可按需修改数字提取更多次
  filter(row_number() <= 2) %>%
  ungroup() %>%
  # 转换为宽表
  pivot_wider(
    id_cols = ID,
    names_from = visit_seq,
    values_from = PRIORITY
  ) %>%
  # 将空值替换为示例中的“空”,不需要可删除此步
  mutate(across(starts_with("PRIORITY"), ~replace_na(.x, "空")))

方法2:基础R实现(无需安装额外包)

# 按用户ID、就诊时间升序排序
data_sorted <- data[order(data$ID, data$TIME), ]
# 为同一用户的记录生成就诊序号
data_sorted$visit_seq <- ave(data_sorted$PRIORITY, data_sorted$ID, FUN = seq_along)
# 筛选前2次就诊记录
data_sorted <- data_sorted[data_sorted$visit_seq <= 2, ]
# 转换为宽表
result <- reshape(
  data_sorted,
  idvar = "ID",
  timevar = "visit_seq",
  v.names = "PRIORITY",
  direction = "wide"
)
# 修改列名符合需求
colnames(result) <- gsub("PRIORITY\\.", "PRIORITY ", colnames(result))
# 空值替换为“空”,不需要可删除此步
result[is.na(result)] <- "空"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:54:02