R语言多timevar数据表重塑:保留raceID/raceDate/finPos对应关系
实现方案
你之前的reshape调用参数配置错误,idvar应设置为行维度的唯一标识personID而非raceID,同时要实现三个赛事字段的绑定关联,需要先对赛事按日期排序生成统一的分组标识,再执行宽表转换即可。
步骤1:准备示例数据(可跳过,直接适配你的真实DT)
DT <- data.frame( personID = c(1,1,2,2,3), raceDate = as.Date(c("2023-01-01","2023-01-08","2023-01-01","2023-01-15","2023-01-08")), raceID = c("R001","R002","R001","R003","R002"), finPos = c(2,1,3,5,4) )
方法1:base R reshape实现
# 提取唯一赛事按日期排序,生成统一赛事分组标识 race_info <- unique(DT[,c("raceID","raceDate")]) race_info <- race_info[order(race_info$raceDate), ] race_info$race_group <- paste0("race_", 1:nrow(race_info)) # 分组标识合并回原数据集 DT <- merge(DT, race_info, by = c("raceID", "raceDate"), all.x = TRUE) # 执行宽表转换 wide_dt <- reshape( DT, idvar = "personID", timevar = "race_group", v.names = c("raceID", "raceDate", "finPos"), direction = "wide", sep = "_" )
方法2:tidyverse更简洁实现
library(dplyr) library(tidyr) wide_dt <- DT %>% # 按比赛日期排序,保证列顺序符合要求 arrange(raceDate) %>% # 生成统一的赛事分组标识 mutate(race_group = paste0("race_", match(raceID, unique(raceID)))) %>% # 宽表转换 pivot_wider( id_cols = personID, names_from = race_group, values_from = c(raceID, raceDate, finPos), names_sep = "_" )
生成的宽表中,同组后缀的raceID_x、raceDate_x、finPos_x自动对应同一场赛事的信息,选手未参加的赛事对应字段会默认填充NA。
内容的提问来源于stack exchange,提问作者codemachino
相关产品推荐
相关产品推荐

