大数据集相关性检验:样本间相关性计算方法合理性咨询
你的方法可行性分析与优化方案
你的思路方向是对的,但现有代码存在关键问题——expression1和expression2都是字符类型,cor()函数无法对字符计算相关性,会返回错误结果,必须先转成数值型。另外还有可以优化的细节,下面分两部分说明:
一、修正你的现有代码
先将表达量列转换为数值类型,再执行你的逻辑:
# 转换表达量列的类型(必须步骤) df1$expression1 <- as.numeric(df1$expression1) df2$expression2 <- as.numeric(df2$expression2) # 修正后的关联计算 test <- left_join(df2, df1, by = "gene") %>% group_by(sample1, sample2) %>% summarize(cor = cor(expression1, expression2), .groups = "drop")
这里添加.groups = "drop"是为了清除分组后的数据框残留分组标记,方便后续处理。
二、更高效的替代方案
如果数据量较大,长格式合并后分组计算可能存在冗余,你可以先把df1转成宽格式(每个样本对应一列表达量),再直接和df2的表达量列计算相关性:
library(tidyr) library(purrr) library(dplyr) # 将df1转换为宽格式 df1_wide <- df1 %>% pivot_wider(id_cols = gene, names_from = sample1, values_from = expression1) %>% mutate(across(a:c, as.numeric)) # 合并df2的表达量数据 df_combined <- df1_wide %>% left_join( df2 %>% select(gene, expression2) %>% mutate(expression2 = as.numeric(expression2)), by = "gene" ) # 批量计算每个样本与g的相关性 cor_results <- map_df(c("a", "b", "c"), function(samp) { tibble( sample1 = samp, sample2 = "g", cor = cor(df_combined[[samp]], df_combined$expression2) ) })
这种方式逻辑更直观,也能避免长格式合并后的数据冗余问题。
另外,由于两个数据框的基因完全匹配,用inner_join替代left_join也可以,结果一致且能避免潜在的不匹配基因干扰。
内容的提问来源于stack exchange,提问作者szmple
相关产品推荐
相关产品推荐

