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

在R中将含多样本的宽格式数据拆分为每行对应单个样本

解决方案:将宽格式样本数据转为单样本单行格式

你的问题是典型的宽格式数据转长格式场景,用dplyr配合tidyr的pivot_longer()函数可以高效解决,比手动用add_row()批量处理更简洁不易出错。

实现代码

library(dplyr)
library(tidyr)

# 模拟你的输入数据集
df <- tibble(
  Patient_ID = c("AB100", "JM200"),
  Patient_name = c("AB", "JM"),
  Sample_1_ID = c("CSF", "CSF"),
  Sample_1_value1 = c(1.0, 2.0),
  Sample_1_value2 = c(2.0, 3.0),
  Sample_2_ID = c("CSF", "CSF"),
  Sample_2_value1 = c(2.0, 4.0),
  Sample_2_value2 = c(3.0, 5.0),
  Sample_3_ID = c("CSF", "CSF"),
  Sample_3_value1 = c(2.0, 3.0),
  Sample_3_value2 = c(4.0, 4.0)
)

# 执行宽转长转换
result_df <- df %>%
  pivot_longer(
    # 选中所有样本相关的列
    cols = starts_with("Sample_"),
    # 拆分列名:第一部分存样本编号,第二部分作为新列名
    names_to = c("Sample", ".value"),
    # 正则表达式匹配列名结构:Sample_编号_字段名
    names_pattern = "Sample_(\\d+)_(.*)"
  ) %>%
  # 移除临时的样本编号列
  select(-Sample)

# 输出结果
print(result_df)

关键参数说明

  • cols = starts_with("Sample_"):自动选中所有以Sample_开头的列,无需手动罗列所有样本列,适配更多样本数量的场景。
  • names_pattern = "Sample_(\\d+)_(.*)":用正则表达式拆分列名,把Sample_1_ID拆分为样本编号1和字段名ID,确保同类型字段能被正确合并。
  • names_to = c("Sample", ".value"):".value"是特殊参数,指示将相同字段名的列合并为新列(比如所有ID列合并成Sample_ID),Sample临时存储编号,后续可以删除。

运行结果

# A tibble: 6 × 4
  Patient_ID Patient_name Sample_ID Sample_value1 Sample_value2
  <chr>      <chr>        <chr>             <dbl>         <dbl>
1 AB100      AB           CSF                  1             2
2 AB100      AB           CSF                  2             3
3 AB100      AB           CSF                  2             4
4 JM200      JM           CSF                  2             3
5 JM200      JM           CSF                  4             5
6 JM200      JM           CSF                  3             4

为什么不用add_row()?

add_row()适合手动添加少量单行数据,而你的场景是批量将多列样本数据拆分到多行,用专门的宽转长函数可以避免重复编写复制患者信息、迁移样本数据的冗余代码,同时保证数据准确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:13:23