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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 17:54:05