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

如何在R语言中按分组将数据框从长格式转为宽格式

R数据框长转宽实现方案

你需要把重复记录subject和session的长格式数据,转换成每个subject-session组合对应3个时间列(t1/t2/t3)的宽格式,以下是两种可行方法:

方法一:使用tidyverse工具(推荐)

借助dplyr分组生成序号,再用tidyr::pivot_wider转宽:

# 加载tidyverse包(未安装先运行install.packages("tidyverse"))
library(tidyverse)

# 原始数据
test <- data.frame(matrix(nrow = 18, ncol = 3))
colnames(test) <- c("subject","session","f1")
test$subject <- c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3)
test$session <- c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2)
test$f1 <-      c(29,52,72,42,50,52,30,49,63,51,37,43,1,3,2,1,2,0)

# 生成组内时间序号,转宽格式
test_wide <- test %>%
  group_by(subject, session) %>%
  mutate(t_num = paste0("t", row_number())) %>%
  ungroup() %>%
  pivot_wider(names_from = t_num, values_from = f1)

# 查看结果
test_wide

方法二:使用Base R原生函数

无需额外安装包,用ave生成序号,再用reshape转宽:

# 原始数据(同上,可省略重复定义)
test <- data.frame(matrix(nrow = 18, ncol = 3))
colnames(test) <- c("subject","session","f1")
test$subject <- c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3)
test$session <- c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2)
test$f1 <-      c(29,52,72,42,50,52,30,49,63,51,37,43,1,3,2,1,2,0)

# 为每个subject-session组添加序号
test$t_num <- with(test, ave(rep(1, nrow(test)), subject, session, FUN = seq_along))
test$t_num <- paste0("t", test$t_num)

# 转宽并清理列名
test_wide_base <- reshape(test, idvar = c("subject", "session"), timevar = "t_num", direction = "wide")
colnames(test_wide_base) <- gsub("f1\\.", "", colnames(test_wide_base))

# 查看结果
test_wide_base

两种方法最终都会生成你需要的6行5列数据框,结构与目标格式完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:23:29