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

在R语言中如何将相同ID的行按列合并

我有如下的数据框:

"ID" "date"
A    01-03-2017
A    05-02-2016
B    08-03-2016
A    09-11-2012
B    02-03-2014
B    09-07-2013
C    23-08-2016
B    24-05-2017
C    12-12-2015

希望将其转换为如下格式:

"ID" "date.1"    "date.2"    "date.3"    "date.4"
A    01-03-2017 05-02-2016 09-11-2012 NA
B    08-03-2016 02-03-2014 09-07-2013 24-05-2017
C    23-08-2016 12-12-2015 NA NA

即把相同ID对应的行转为列,每一行对应一个新列,烦请告知实现方法,万分感谢!

实现方法(R语言)

这个需求是典型的长格式转宽格式操作,下面给你两种常用的实现方式:

方法1:使用tidyverse工具链(推荐,代码可读性高)

首先确保你已经安装了tidyverse包,如果没有的话先安装:

install.packages("tidyverse")

然后按照以下步骤操作:

  1. 先构造正确的原始数据框(如果你的数据还没整理成两列结构的话):
library(tidyverse)

# 原始数据整理成data.frame
df <- data.frame(
  ID = c("A", "A", "B", "A", "B", "B", "C", "B", "C"),
  date = c("01-03-2017", "05-02-2016", "08-03-2016", "09-11-2012", 
           "02-03-2014", "09-07-2013", "23-08-2016", "24-05-2017", "12-12-2015"),
  stringsAsFactors = FALSE
)
  1. 给每个ID的日期添加分组内的序号,再转换为宽格式:
df_wide <- df %>%
  # 按ID分组
  group_by(ID) %>%
  # 给每个ID下的日期生成序号,命名为date.1、date.2...
  mutate(date_col = paste0("date.", row_number())) %>%
  # 转宽格式,把date_col作为列名,date作为对应值
  pivot_wider(names_from = date_col, values_from = date) %>%
  # 取消分组
  ungroup()

# 查看结果
print(df_wide)

执行后得到的结果就和你想要的完全一致,缺失的位置会自动填充NA。

方法2:使用data.table(适合处理大规模数据,速度更快)

如果你需要处理的数据集很大,推荐用data.table包,效率更高:

  1. 安装并加载data.table:
install.packages("data.table")
library(data.table)
  1. 转换为宽格式:
# 把普通data.frame转为data.table
setDT(df)

# 使用dcast转宽,rowid(ID)生成每个ID内的序号
df_wide <- dcast(df, ID ~ paste0("date.", rowid(ID)), value.var = "date")

# 查看结果
print(df_wide)

两种方法都能实现你的需求,你可以根据自己的使用习惯选择~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:41:31