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

R长格式面板数据按分组保留重复Index最后记录并局部转宽方法问询

R语言实现方案

使用tidyverse生态的标准函数即可完成需求,无需手写循环,具体代码如下:

第一步:加载依赖包

library(tidyverse)

第二步:标记分组内行序号

按participant.code、round、Index分组,标记每组内的行序号和最后一行标识:

df <- df %>%
  group_by(participant.code, round, Index) %>%
  mutate(
    row_in_group = row_number(),
    is_last = row_in_group == n()
  ) %>%
  ungroup()

第三步:拆分并处理两部分数据

# 提取每组最后一行作为基础数据集,保留原有结构
base_df <- df %>%
  filter(is_last) %>%
  select(-row_in_group, -is_last)
# 提取非最后一行的观测,转换为宽格式
wide_part <- df %>%
  filter(!is_last) %>%
  # 将所有数值列转为长格式,方便拼接新列名,cols参数可替换为你实际的数值列列表
  pivot_longer(
    cols = c(secs_since_round_s, delta, data),
    names_to = "origin_col",
    values_to = "val"
  ) %>%
  # 生成新列名:事件名_原数值列名,替换空格为下划线避免语法问题
  mutate(
    new_col = str_replace_all(paste0(name, "_", origin_col), "\\s+", "_")
  ) %>%
  # 按分组转宽
  pivot_wider(
    id_cols = c(participant.code, round, Index),
    names_from = new_col,
    values_from = val
  )

第四步:合并得到最终结果

final_df <- left_join(
  base_df,
  wide_part,
  by = c("participant.code", "round", "Index")
)

说明

如果你的数据集有更多数值列,只需要修改pivot_longer的cols参数即可,若事件名称name包含特殊字符,可以提前用str_squish()、str_remove_all()等函数清理后再拼接列名。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:15:03