如何将数据框单列值重排为不同名称的多列(R语言)
数据转换解决方案
使用tidyverse实现
适合熟悉dplyr/tidyr的用户,代码逻辑清晰:
library(tidyverse) # 构造示例数据 df = data.frame(ID = c(1,1,1,2,2,2,2,2), treatment = c('AB','CD','EF','AB','CD','GH','IM','LN') ) # 转换为宽格式 df_wide <- df %>% group_by(ID) %>% # 给每个ID内的treatment按顺序生成列名后缀 mutate(treatment_col = paste0("treatment_", row_number())) %>% # 转宽,将treatment_col作为列名,treatment作为值 pivot_wider(names_from = treatment_col, values_from = treatment) %>% ungroup() print(df_wide)
使用data.table实现
针对数千个ID的大数据量,data.table的运算效率更高:
library(data.table) # 构造示例数据 df = data.frame(ID = c(1,1,1,2,2,2,2,2), treatment = c('AB','CD','EF','AB','CD','GH','IM','LN') ) # 转换为data.table格式 setDT(df) # 转宽,rowid(ID)生成每个ID内的行序号,作为列名后缀 df_wide <- dcast(df, ID ~ paste0("treatment_", rowid(ID)), value.var = "treatment") print(df_wide)
关键逻辑说明
核心是在每个ID分组内生成连续的序号,以此作为宽格式列名的后缀。这样每个ID的treatment会按自身顺序填充到对应的treatment_1、treatment_2等列中,不足的位置自动补<NA>,避免了错误结果中跨ID错位填充的问题。
内容的提问来源于stack exchange,提问作者An116
相关产品推荐
相关产品推荐

