如何用dplyr的pivot_wider做多列宽转换并同步生成新协变量
蛋白质组学长转宽格式dplyr实现方案
操作思路
- 拆分原始数据集,分别提取前4行的患者协变量信息,以及第5行及以后的蛋白表达定量数据
- 对协变量表做长宽转换,匹配对应字段名,同时将原Intensity开头的列名设为患者id
- 对蛋白定量表做长宽转换,以基因名作为宽表列名,对应表达量作为列值
- 关联协变量表和蛋白定量表,将表达量列统一转为数值型即可
实现代码
# 加载依赖包(dplyr、tidyr均包含在tidyverse套件中) library(tidyverse) # 1. 整理患者协变量表 cov_df <- Heat_BT %>% slice(1:4) %>% # 提取前4行协变量 select(-protein, -gene) %>% # 剔除空值的前两列 # 按行顺序对应协变量字段名,可根据你的实际字段需求修改 mutate(cov_name = c("lab", "malig", "diag", "group")) %>% pivot_longer(-cov_name, names_to = "id", values_to = "value") %>% pivot_wider(names_from = cov_name, values_from = value) # 2. 整理蛋白表达量表 protein_df <- Heat_BT %>% slice(5:n()) %>% # 提取第5行及以后的所有蛋白定量数据 select(-protein) %>% # 如需要保留蛋白全称可删除这一行 pivot_longer(-gene, names_to = "id", values_to = "intensity") %>% pivot_wider(names_from = gene, values_from = intensity) %>% mutate(across(-id, as.numeric)) # 将所有蛋白表达量转为数值格式 # 3. 关联两张表得到最终宽格式结果 final_df <- cov_df %>% left_join(protein_df, by = "id")
适配说明
上述代码可直接适配你提到的1800行蛋白、60列的全量数据集,无需修改核心逻辑。如果你的数据集除了Intensity开头的患者列外还有其他自定义患者字段,只需在第一步select操作中保留对应列即可。
内容的提问来源于stack exchange,提问作者cmirian
相关产品推荐
相关产品推荐

