在R中按分组重排数据框:将每组葡萄糖值横向同行排列
解决方案
你需要先给每个餐组(A列)内的葡萄糖值添加组内序号,再将长表转换为宽表,之前用dcast失败大概率是因为缺少这个序号标识,导致函数无法确定如何将多行映射为多列。以下是两种常用实现方法:
方法一:使用tidyverse工具链(dplyr + tidyr)
library(dplyr) library(tidyr) # 构建示例数据框(替换为你的实际数据) df <- data.frame( A = c(1,1,1,2,2,3,3,3), B = c("12:10","12:15","12:20","15:05","15:10","20:35","20:40","20:45"), C = c(5.8,7.1,6.2,4.2,8.8,5.9,11.2,7.8), D = c("a","a","b","b","b","a","c","c") ) # 转换流程 result <- df %>% arrange(A, B) %>% # 按餐型和时间排序,保证葡萄糖值顺序正确 group_by(A) %>% mutate(col_index = row_number()) %>% # 给每个餐组内的行生成序号 ungroup() %>% pivot_wider(id_cols = A, names_from = col_index, values_from = C) # 长转宽 print(result)
方法二:使用data.table包
library(data.table) # 构建示例数据框(替换为你的实际数据) df <- data.frame( A = c(1,1,1,2,2,3,3,3), B = c("12:10","12:15","12:20","15:05","15:10","20:35","20:40","20:45"), C = c(5.8,7.1,6.2,4.2,8.8,5.9,11.2,7.8), D = c("a","a","b","b","b","a","c","c") ) setDT(df) df[, col_index := seq_len(.N), by = A] # 生成组内序号 result_dt <- dcast(df, A ~ col_index, value.var = "C") # 长转宽 print(result_dt)
结果说明
两种方法都会输出符合你需求的数据框:A列为餐型标识,同一餐组的葡萄糖值按时间顺序排列在同一行,行数等于餐组数量,列数等于最大的餐组数据点数量,数据点不足的位置会填充NA(可根据需求用replace_na()等函数处理)。
内容的提问来源于stack exchange,提问作者user21528954
相关产品推荐
相关产品推荐

