在R中如何将带数字后缀的多列按对应关系堆叠为长格式?
R语言:用循环实现宽表转长表(多组带后缀列合并)
针对你的宽格式dataframe,要把每组Team_N、Team_Desc_N、Team_URL_N合并成单列表,同时保留Company信息,用循环可以这么做:
第一步:确定数据组数
先从列名里提取所有数字后缀,找到最大的编号,以此确定循环次数:
# 提取所有带数字后缀列的编号 suffix_nums <- as.integer(gsub(".*_([0-9]+)$", "\\1", colnames(df)[grepl("_\\d+$", colnames(df))])) max_group <- max(suffix_nums)
第二步:循环提取每组数据并合并
先创建一个空的结果表,然后逐个提取每组的列,重命名后合并到结果中:
# 初始化空的长格式结果表 long_result <- data.frame() for (i in 1:max_group) { # 定义当前组的目标列名 target_cols <- c("Company", paste0("Team_", i), paste0("Team_Desc_", i), paste0("Team_URL_", i)) # 检查列是否存在,避免因缺列报错 if (all(target_cols %in% colnames(df))) { # 提取当前组数据 temp_df <- df[target_cols] # 重命名为你需要的列名 colnames(temp_df) <- c("Company", "Team", "Team_Desc", "Team_URL") # 合并到结果表 long_result <- rbind(long_result, temp_df) } } # 重置行号(可选,让行号连续规整) rownames(long_result) <- NULL
额外说明
- 这段代码会自动适配你的列数,不管有多少组(200多列的话,对应大概60+组数据)
- 加入了列存在性检查,防止某一组缺列导致运行报错
- 如果原数据包含NA值,合并后会保留,不影响结果结构
更高效的非循环方案(推荐学习)
虽然你要求用循环,但作为R初学者,推荐了解下tidyr包的pivot_longer函数,处理这类宽转长问题更简洁高效:
library(tidyr) long_result <- df %>% pivot_longer( cols = starts_with("Team_"), # 选中所有以Team_开头的列 names_to = c(".value", "group"), # .value保留前缀作为新列名,group提取数字后缀 names_pattern = "(.*)_(\\d+)" # 匹配列名的前缀和数字部分 ) %>% select(-group) # 移除不需要的group列
这个方法无需手动写循环,代码更简洁,处理大量数据时速度也更快。
内容的提问来源于stack exchange,提问作者Soph2010
相关产品推荐
相关产品推荐

