如何基于两个独立dataframe合并生成符合要求的相关系数矩阵
解决步骤
你之前用merge达不到目标是因为merge仅能实现横向按行拼接,无法完成列转行的维度转换,按以下方法实现即可:
方法1:tidyverse 实现(推荐,代码简洁易读)
library(tidyverse) # 因为两个数据框行完全对应同一样本,直接横向拼接 combined_df <- cbind(df1, df2) target_df <- combined_df %>% # 将df2的3个颜色列转为长格式 pivot_longer(cols = c(blue, yellow, green), names_to = "color", values_to = "val") %>% # 按颜色分组,对A-E列做自定义聚合(以下以计算均值为例,可替换为求和、中位数等你需要的逻辑) group_by(color) %>% summarise(across(c(A,B,C,D,E), mean)) %>% # 将颜色列设为行名,匹配你要的结构 column_to_rownames("color")
方法2:base R 实现(无需安装额外包)
# 横向拼接两个数据框 combined_df <- cbind(df1, df2) color_cols <- colnames(df2) feature_cols <- colnames(df1) # 初始化目标数据框 target_df <- data.frame(matrix(nrow = length(color_cols), ncol = length(feature_cols))) rownames(target_df) <- color_cols colnames(target_df) <- feature_cols # 循环填充值,逻辑和上面tidyverse版本一致 for (color in color_cols) { for (f in feature_cols) { # 可根据你的实际需求修改此处的计算规则 target_df[color, f] <- mean(combined_df[combined_df[[color]] == 1, f]) } }
注:如果你需要的单元格数值不是分组均值,可自行修改聚合/循环内的计算逻辑,比如计算颜色列和A-E列的皮尔逊相关性,就把计算部分替换为
cor(combined_df[[color]], combined_df[[f]])即可。
得到的target_df就是你需要的结构,后续可以直接用as.matrix()转为矩阵类型。
内容的提问来源于stack exchange,提问作者Drashti
相关产品推荐
相关产品推荐

