如何在R语言中将含重复行的数据框转换为新增唯一标识列的格式?
数据框行转列解决方案
需求说明
将包含重复名称行的长格式数据框,转换为以唯一名称为行、各对应值为列的宽格式数据框,无需硬编码行数,适配名称顺序变化的场景。
原始数据示例
df <- data.frame(matrix(nrow = 20, ncol = 2)) df[1:10,1] <- c("HeaderStart","LevelName","Experiment","SessionTime", "Subject","Session","ImgPath","RandomSeed", "DisplayRefreshRate","Level") df[11:20,1] <- c("HeaderStart","LevelName","Experiment","SessionTime", "Subject","Session","ImgPath","RandomSeed", "DisplayRefreshRate","Level") df[1:10,2] <- seq(1,10,1) df[11:20,2] <- seq(1,10,1)
方法一:使用tidyverse工具包
适合需要灵活数据处理的场景,代码简洁易读:
library(tidyverse) df_result <- df %>% group_by(X1) %>% mutate(col_num = paste0("X", row_number() + 1)) %>% ungroup() %>% pivot_wider(names_from = col_num, values_from = X2) %>% arrange(match(X1, df$X1[!duplicated(df$X1)]))
代码解释
group_by(X1):按名称分组,确保每个名称的所有对应值被归为一组mutate(...):为每组内的行生成新列名,自动适配分组数量pivot_wider:将长表转为宽表,实现行转列arrange(...):可选步骤,保留名称在原始数据中首次出现的顺序
方法二:基础R实现
无需额外安装包,适合轻量处理:
# 获取唯一名称 unique_names <- unique(df$X1) # 提取每个名称对应的所有值 value_list <- lapply(unique_names, function(x) df$X2[df$X1 == x]) # 组合为数据框 df_result_base <- data.frame(X1 = unique_names, do.call(cbind, value_list)) # 重命名列 colnames(df_result_base) <- c("X1", paste0("X", 2:(ncol(df_result_base)))) # 按原始顺序排序 df_result_base <- df_result_base[match(unique_names, df$X1[!duplicated(df$X1)]), ]
效果验证
两种方法运行后均会生成目标格式的数据框:
X1 X2 X3 1 HeaderStart 1 1 2 LevelName 2 2 3 Experiment 3 3 4 SessionTime 4 4 5 Subject 5 5 6 Session 6 6 7 ImgPath 7 7 8 RandomSeed 8 8 9 DisplayRefreshRate 9 9 10 Level 10 10
内容的提问来源于stack exchange,提问作者jc2525
相关产品推荐
相关产品推荐

