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
相关产品推荐
相关产品推荐

