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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:55:17