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

RStudio实现长表转宽表:按ID分组升序填充日期列

解决方案

可以用dplyr + tidyr组合处理,完全适配你的需求,不管数据集多大、最大列数未知的情况都能自动处理:

步骤说明

  1. 按ID分组,对每个ID内的Date做升序排序,同时生成每个日期对应的序号(比如date_1、date_2),作为宽格式的列名
  2. 转换为宽格式,自动补全所有需要的列,无数据的位置用0填充,同时忽略Fruit列

代码实现

library(dplyr)
library(tidyr)

# 假设你的数据集叫df,先处理分组排序并生成序号
df_processed <- df %>%
  group_by(ID) %>%
  arrange(Date, .by_group = TRUE) %>%  # 按ID分组内的Date升序排列
  mutate(col_name = paste0("date_", row_number())) %>%  # 生成列名
  ungroup()

# 转换为宽格式,空值填0
df_wide <- df_processed %>%
  pivot_wider(
    id_cols = ID,
    names_from = col_name,
    values_from = Date,
    values_fill = list(Date = 0)  # 无数据的位置填充0
  )

示例验证

比如你的原始数据是这样的:

df <- tibble(
  ID = c(1,1,2,2,2,3),
  Fruit = c("Apple", "Banana", "Orange", "Grape", "Mango", "Peach"),
  Date = as.Date(c("2023-01-01", "2023-01-03", "2023-02-01", "2023-02-05", "2023-02-10", "2023-03-01"))
)

运行代码后得到的宽格式数据会自动生成3列(因为ID2有最多3条记录),ID1的第三列填0,ID3的第二、第三列填0,完全符合需求。

大数据集优化方案

如果数据集极大,tidyverse的函数效率可能不够,可以改用data.table的dcast提速,代码如下:

library(data.table)
setDT(df)
df[, col_name := paste0("date_", 1:.N), by = ID]
df_wide <- dcast(df, ID ~ col_name, value.var = "Date", fill = 0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:25:04