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

R语言如何按ID将长数据框宽化为单行多CODE列格式

R 多值列宽化实现方案

核心逻辑:先为每个ID分组下的CODE生成组内序号,再按序号将CODE转成多列即可,比拼接拆分的方法性能更高,写法更简洁。

方案1:tidyverse 实现(推荐)

保留重复CODE版本

对应第一种输出效果,同ID的重复CODE会保留:

library(tidyverse)

# 示例数据
ID<-c(1, 2, 2, 2, 3, 3,4)
CODE<-c(123, 938, 293, 456, 203, 203, 91)
df <- data.frame(ID, CODE)

# 转宽代码
df_wide <- df %>%
  group_by(ID) %>%
  mutate(col_name = paste0("CODE", row_number())) %>%
  ungroup() %>%
  pivot_wider(names_from = col_name, values_from = CODE)

同ID去重版本

对应第二种优化效果,同ID的重复CODE仅保留1个:

df_wide_unique <- df %>%
  # 先按ID+CODE去重
  distinct(ID, CODE) %>%
  group_by(ID) %>%
  mutate(col_name = paste0("CODE", row_number())) %>%
  ungroup() %>%
  pivot_wider(names_from = col_name, values_from = CODE)

方案2:base R 实现

无需加载第三方包,适合纯base R场景:

保留重复CODE版本

# 生成组内序号
df$col_name <- ave(df$CODE, df$ID, FUN = seq_along)
# 转宽
df_wide <- reshape(df, idvar = "ID", timevar = "col_name", direction = "wide", sep = "")
# 可选:重置行号
rownames(df_wide) <- NULL

同ID去重版本

# 先去重
df_unique <- unique(df[, c("ID", "CODE")])
# 生成组内序号
df_unique$col_name <- ave(df_unique$CODE, df_unique$ID, FUN = seq_along)
# 转宽
df_wide_unique <- reshape(df_unique, idvar = "ID", timevar = "col_name", direction = "wide", sep = "")
# 可选:重置行号
rownames(df_wide_unique) <- NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:57:04