RStudio实现长表转宽表:按ID分组升序填充日期列
解决方案
可以用dplyr + tidyr组合处理,完全适配你的需求,不管数据集多大、最大列数未知的情况都能自动处理:
步骤说明
- 按
ID分组,对每个ID内的Date做升序排序,同时生成每个日期对应的序号(比如date_1、date_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
相关产品推荐
相关产品推荐

