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

