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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:25:16