如何在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
相关产品推荐
相关产品推荐

