在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")
然后按照以下步骤操作:
- 先构造正确的原始数据框(如果你的数据还没整理成两列结构的话):
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 )
- 给每个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包,效率更高:
- 安装并加载data.table:
install.packages("data.table") library(data.table)
- 转换为宽格式:
# 把普通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
相关产品推荐
相关产品推荐

