如何拆分数据框/矩阵的多列并将结果保存为数据框?
拆分矩阵多列为对应新列的解决方法
你的问题核心是:矩阵中每个单元格是两个字符,需要将每个单元格拆分为两个字符,分别存入对应原列命名的新列中。之前的代码失败是因为apply返回的列表结构无法直接转换为常规数据框——每个列的元素是长度为2的字符向量组成的列表,而非普通字符向量。
以下是两种可行的实现方式:
方法一:Base R 原生实现
直接对每一列进行拆分,提取两个字符并生成对应列,最后合并为数据框:
# 提取每个单元格的第一个字符,生成对应列 geno_first <- sapply(mGenotype, function(col) { sapply(strsplit(col, ""), `[`, 1) }) # 提取每个单元格的第二个字符,生成对应列 geno_second <- sapply(mGenotype, function(col) { sapply(strsplit(col, ""), `[`, 2) }) # 重命名新列,与原列名关联 colnames(geno_first) <- paste0(colnames(mGenotype), "_a") colnames(geno_second) <- paste0(colnames(mGenotype), "_b") # 合并为最终数据框 final_df <- cbind(as.data.frame(geno_first), as.data.frame(geno_second))
方法二:tidyverse 简洁实现
利用tidyverse的工具链,通过长格式转换拆分后再转回宽格式,代码可读性更强:
library(tidyverse) final_df <- as.data.frame(mGenotype) %>% # 添加行号用于后续合并 mutate(row_id = row_number()) %>% # 将所有基因型列转为长格式 pivot_longer(-row_id, names_to = "geno_col", values_to = "genotype") %>% # 拆分每个基因型字符串的两个字符 mutate( geno_a = str_sub(genotype, 1, 1), geno_b = str_sub(genotype, 2, 2) ) %>% # 转回宽格式,生成对应新列 pivot_wider( id_cols = row_id, names_from = geno_col, values_from = c(geno_a, geno_b), names_sep = "_" ) %>% # 移除临时行号列 select(-row_id)
验证结果:运行head(final_df)即可查看拆分后的前几行数据,每个原列对应两个新列(如genotype1_a和genotype1_b),分别存储原单元格的第一个和第二个字符。
内容的提问来源于stack exchange,提问作者sahuno
相关产品推荐
相关产品推荐

