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

如何在R中将matrix或data.frame的列重复n次并生成唯一列名

问题原因

你的原有代码存在两个核心问题:

  • 代码中引用了不存在的sid列,你实际创建的行名标识列是drinks,第一步长宽转换就会报错
  • 重复行之后没有给同一水果的5个重复项加唯一标识,转宽格式时同名列无法区分,就会被自动合并/移除

解决方案

方案1:直接操作矩阵(效率更高,适合大矩阵)

不需要转tibble做长宽转换,直接对矩阵的列做重复,再生成唯一列名即可:

# 生成重复的列索引,每列重复5次
rep_col_idx <- rep(seq_len(ncol(M)), each = 5)
# 生成唯一列名,格式为原列名_序号
new_colnames <- paste0(rep(colnames(M), each = 5), "_", rep(1:5, ncol(M)))
# 生成新矩阵
M_new <- M[, rep_col_idx]
colnames(M_new) <- new_colnames

方案2:修改你的tidyverse实现逻辑

如果需要用dplyr/purrr生态的方法,只要在重复后给每个重复项加唯一序号,拼接成唯一列名再转宽即可:

library(tidyverse)

M %>% 
  # 转tibble时直接把行名转为drinks列
  as_tibble(rownames = "drinks") %>% 
  pivot_longer(-drinks, names_to = "fruit", values_to = "value") %>% 
  # 按行标识和水果名分组,每组重复5次同时生成序号
  group_by(drinks, fruit) %>% 
  slice(rep(1:n(), each = 5)) %>% 
  mutate(rep_seq = row_number()) %>% 
  ungroup() %>% 
  # 拼接出唯一的新列名
  mutate(col_name = paste0(fruit, "_", rep_seq)) %>% 
  # 转宽时用新的唯一列名
  pivot_wider(id_cols = drinks, names_from = col_name, values_from = value)

内容的提问来源于stack exchange,提问作者HCAI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:27:02