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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:15:31