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

如何拆分数据框/矩阵的多列并将结果保存为数据框?

拆分矩阵多列为对应新列的解决方法

你的问题核心是:矩阵中每个单元格是两个字符,需要将每个单元格拆分为两个字符,分别存入对应原列命名的新列中。之前的代码失败是因为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:47:35