R语言中如何比较两个质谱数据矩阵的数值
质谱矩阵比对筛选解决方案
核心逻辑
- 取两个矩阵第一列登录号的交集,仅保留同时出现在两个矩阵中的登录号
- 对每个共有登录号,提取其在m1中对应的第二列数值,校验是否满足
m1数值 * 2 > 2的条件 - 将满足条件的登录号和目标数值(可自行选择取m1或m2的对应数值,以下示例默认取m2的数值)输出为新矩阵
R语言实现(生信分析场景常用)
# 1. 构造示例矩阵,实际使用时直接导入你的数据即可 m1 <- matrix(c("Q1", "Q2", 2, 1), ncol = 2, dimnames = list(NULL, c("登录号", "数值"))) m2 <- matrix(c("Q2", "P5", 3, 1), ncol = 2, dimnames = list(NULL, c("登录号", "数值"))) # 2. 转换为数据框并格式化数值列 m1_df <- as.data.frame(m1, stringsAsFactors = FALSE) m1_df$数值 <- as.numeric(m1_df$数值) m2_df <- as.data.frame(m2, stringsAsFactors = FALSE) m2_df$数值 <- as.numeric(m2_df$数值) # 3. 取共有登录号 common_ids <- intersect(m1_df$登录号, m2_df$登录号) # 4. 筛选符合条件的条目 filtered_rows <- lapply(common_ids, function(id) { m1_val <- m1_df$数值[m1_df$登录号 == id] # 满足条件则返回对应行,需要取m1的数值就把下方m2_df替换为m1_df if (m1_val * 2 > 2) return(m2_df[m2_df$登录号 == id, ]) }) # 5. 转换为结果矩阵 result_matrix <- as.matrix(do.call(rbind, filtered_rows)) # 输出结果 print(result_matrix)
示例结果说明
你提供的示例中,两个矩阵的共有登录号只有Q2,其在m1的对应数值为1,计算得1*2=2不满足大于2的条件,所以示例运行后得到空矩阵。如果把m1中Q2的数值改为2,就会输出Q2和对应数值的结果。
Python实现
import pandas as pd # 1. 构造示例数据,实际使用时直接读入你的csv/tsv文件即可 m1 = pd.DataFrame([["Q1", 2], ["Q2", 1]], columns=["登录号", "数值"]) m2 = pd.DataFrame([["Q2", 3], ["P5", 1]], columns=["登录号", "数值"]) # 2. 合并取共有登录号的行 merge_data = pd.merge(m1, m2, on="登录号", suffixes=("_m1", "_m2")) # 3. 筛选符合条件的行,需要保留m1的数值就把下方数值_m2改为数值_m1 filter_data = merge_data[merge_data["数值_m1"] * 2 > 2][["登录号", "数值_m2"]] # 4. 转换为矩阵格式 result_matrix = filter_data.values # 输出结果 print(result_matrix)
内容的提问来源于stack exchange,提问作者ECE SEYREK
相关产品推荐
相关产品推荐

