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
相关产品推荐
相关产品推荐

