使用R将化合物列表分配至dataframe/矩阵 确保行列无重复质量值
R语言实现化合物按质量规则拆分到多个数据框
现有包含化合物ID和对应质量的数据集,需要将化合物拆分到多个独立数据框中,要求同一数据框内的同一行或同一列不得出现多个相同质量的化合物。
示例数据集
dfx <- data.frame(id = c("A_0401923-001-AA", "A_0401924-001-AA", "A_0401925-001-CF", "A_0402137-001-AA", "A_0402138-001-AA", "A_0402139-001-AA", "A_0402140-001-AA", "A_0402141-001-AA", "A_0402142-001-CF", "A_0402158-001-CN", "A_0402159-001-CN", "A_0403516-001-AA", "A_0403517-001-AA", "A_0403518-001-CF", "A_0403522-001-AA", "A_0403523-001-AA", "A_0403784-001-AA", "A_0403785-001-CF", "A_0403786-001-CF", "A_0403787-001-CF", "A_0403788-001-AA", "A_0403789-001-AA"), mass = c("697.3475489", "697.3475489", "782.3461691", "634.259184", "618.3417352", "618.3417352", "636.2981563", "636.2981563", "782.3461691", "618.3417352", "634.259184", "634.259184", "729.31962", "728.3243711", "728.3243711", "729.31962", "771.4119607", "771.4119607", "783.3665702", "783.3665702", "784.3708241", "784.3708241"))
实现思路
- 首先对相同质量的化合物编号,确定所需的最小行数(等于同一质量的最大出现次数)
- 按照「同行/同列无重复质量」的规则为每个化合物分配所属数据框、行号、列号
- 按分配结果拆分生成独立数据框,可自行调整每个数据框的最大列数
完整实现代码
library(dplyr) library(tidyr) # 预处理:为相同质量的化合物添加序列编号 df_process <- dfx %>% group_by(mass) %>% mutate(mass_seq = row_number()) %>% ungroup() # 确定每个数据框的固定行数:等于同一质量的最大出现次数 n_row <- max(df_process$mass_seq) # 为每个化合物分配列号和数据框编号,此处每板最大列数设为5,可按需修改参数 df_allocated <- df_process %>% group_by(mass_seq) %>% mutate(col = match(mass, unique(mass))) %>% mutate(plate = ceiling(col / 5)) %>% ungroup() # 拆分生成独立数据框列表 plate_list <- df_allocated %>% group_split(plate, .keep = FALSE) %>% lapply(function(x) { x %>% pivot_wider(names_from = col, values_from = id, values_fill = "") %>% arrange(mass_seq) %>% select(-mass_seq) }) # 按需调取对应数据框,例如调取第一个数据框 plate_list[[1]]
效果示例

内容的提问来源于stack exchange,提问作者RanonKahn
相关产品推荐
相关产品推荐

