如何基于ID列实现宽表转换且不合并其他列?(R语言)
按ID分组生成对应宽表的解决方案
针对需要将长格式数据按ID分组,转成包含多组event_type和event_info的宽表(空缺值补NA)的需求,以下提供两种高效实现方式:
方法一:使用data.table包(适合大数据场景)
library(data.table) # 示例数据 df <- data.table(ID = c(123,123,123,234,456, 234), event_type = c("Museum","Concert","Park","Garden","Museum", "Museum"), event_info = c("5496:C", "5434:D", "1236:C", "534126:A", "5496:C", "0129:Z")) # 为每个ID组内的行生成序号 df[, row_id := seq_len(.N), by = ID] # 转换为宽表,同时映射event_type和event_info两列 wide_df <- dcast(df, ID ~ row_id, value.var = c("event_type", "event_info")) # 输出结果 print(wide_df)
执行后会自动生成event_type.1、event_type.2...以及对应位置的event_info.1、event_info.2列,ID出现次数不足的位置自动填充NA,完全匹配需求格式。
方法二:使用tidyverse工具包(语法更直观)
library(tidyverse) # 示例数据 df <- tibble(ID = c(123,123,123,234,456, 234), event_type = c("Museum","Concert","Park","Garden","Museum", "Museum"), event_info = c("5496:C", "5434:D", "1236:C", "534126:A", "5496:C", "0129:Z")) # 分组生成行号后转宽表 wide_df <- df %>% group_by(ID) %>% mutate(row_id = row_number()) %>% ungroup() %>% pivot_wider( names_from = row_id, values_from = c(event_type, event_info), names_glue = "{.value}.{row_id}" # 指定列名格式 ) # 输出结果 print(wide_df)
通过row_number()标记组内行的顺序,再用pivot_wider完成宽表转换,同样会自动补全NA值,保持event_type与event_info的对应关系。
内容的提问来源于stack exchange,提问作者Sky Scraper
相关产品推荐
相关产品推荐

