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

