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

