【问题标题】:How to merge information of two matrices where one is a sub matrice of another but having different information如何合并两个矩阵的信息,其中一个是另一个的子矩阵但具有不同的信息
【发布时间】:2016-09-21 13:05:14
【问题描述】:

如何合并两个矩阵的信息,其中一个是另一个矩阵的子矩阵,但具有不同的信息。

我有两个矩阵 (1223x1223) 和 (7096x7096)。 Bot这些矩阵包含从0到1的药库药物-药物距离分数。因此,较大的矩阵包含药物的化学结构相似性,较小的矩阵包含不同的相似性分数。

我想知道如何将这两个合并为一个矩阵(数据融合)以获取两个矩阵的信息。因此,如果药物 1 和药物 2 在两个矩阵中的得分分别为 0.5 和 0.7,那么融合数据的最佳方法是什么,以免丢失信息。

这是我的数据示例:

Data1
          DB00006   DB00014   DB00035   DB00050   DB00091   DB00093   DB00104   DB00115
DB00006 1.0000000 0.8139535 0.8205128 0.7976190 0.6075949 0.6835443 0.6547619 0.6666667
DB00014 0.8139535 1.0000000 0.7500000 0.8111111 0.5617978 0.6292135 0.6966292 0.7200000
DB00035 0.8205128 0.7500000 1.0000000 0.7325581 0.5243902 0.8450704 0.7564103 0.6122449
DB00050 0.7976190 0.8111111 0.7325581 1.0000000 0.5764706 0.6091954 0.6976744 0.6700000
DB00091 0.6075949 0.5617978 0.5243902 0.5764706 1.0000000 0.4871795 0.5250000 0.5543478
DB00093 0.6835443 0.6292135 0.8450704 0.6091954 0.4871795 1.0000000 0.8028169 0.5360825
DB00104 0.6547619 0.6966292 0.7564103 0.6976744 0.5250000 0.8028169 1.0000000 0.5816327

Data2
            DB07768    DB07886    DB07702    DB07465    DB08567    DB07129    DB08298
DB00014 0.260115607 0.19402985 0.22112211 0.11636364 0.26256983 0.18936877 0.29700855
DB00035 0.176344086 0.19935691 0.19545455 0.15606936 0.21489362 0.19523810 0.23456790
DB00050 0.037470726 0.05490196 0.05298013 0.09090909 0.03318584 0.05755396 0.03664921
DB00091 0.211974110 0.21052632 0.14814815 0.11666667 0.28192372 0.15856777 0.32452830
DB00104 0.200686106 0.20642202 0.15877437 0.12420382 0.26795096 0.19174041 0.31653226
DB00122 0.002469136 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000

数据

Data1 <- 
structure(c(1, 0.813953488, 0.820512821, 0.797619048, 0.607594937, 
0.683544304, 0.654761905, 0.813953488, 1, 0.75, 0.811111111, 
0.561797753, 0.629213483, 0.696629213, 0.820512821, 0.75, 1, 
0.73255814, 0.524390244, 0.845070423, 0.756410256, 0.797619048, 
0.811111111, 0.73255814, 1, 0.576470588, 0.609195402, 0.697674419, 
0.607594937, 0.561797753, 0.524390244, 0.576470588, 1, 0.487179487, 
0.525, 0.683544304, 0.629213483, 0.845070423, 0.609195402, 0.487179487, 
1, 0.802816901, 0.654761905, 0.696629213, 0.756410256, 0.697674419, 
0.525, 0.802816901, 1, 0.666666667, 0.72, 0.612244898, 0.67, 
0.554347826, 0.536082474, 0.581632653), .Dim = 7:8, .Dimnames = list(
    c("DB00006", "DB00014", "DB00035", "DB00050", "DB00091", 
    "DB00093", "DB00104"), c("DB00006", "DB00014", "DB00035", 
    "DB00050", "DB00091", "DB00093", "DB00104", "DB00115")))

Data2 <-
structure(c(0.260115607, 0.176344086, 0.037470726, 0.21197411, 
0.200686106, 0.002469136, 0.194029851, 0.199356913, 0.054901961, 
0.210526316, 0.206422018, 0, 0.221122112, 0.195454545, 0.052980132, 
0.148148148, 0.158774373, 0, 0.116363636, 0.156069364, 0.090909091, 
0.116666667, 0.124203822, 0, 0.262569832, 0.214893617, 0.033185841, 
0.281923715, 0.267950963, 0, 0.189368771, 0.195238095, 0.057553957, 
0.158567775, 0.191740413, 0, 0.297008547, 0.234567901, 0.036649215, 
0.324528302, 0.316532258, 0), .Dim = 6:7, .Dimnames = list(c("DB00014", 
"DB00035", "DB00050", "DB00091", "DB00104", "DB00122"), c("DB07768", 
"DB07886", "DB07702", "DB07465", "DB08567", "DB07129", "DB08298"
)))

【问题讨论】:

  • 也许最容易将两个矩阵重塑为长格式(请参阅reshape2::melt),因此您有三列 - drug1、drug2 和 value。然后合并这些(见merge)。
  • 所以合并将简单地添加来自 drug1-drug2 关系的值?
  • @Anurag ;如果你融化两个矩阵,你将有两个三列数据框。然后,您可以通过前两列合并这些列(其中将包含来自矩阵列和行的药物名称)。如需更具体的建议,您应该使用small, reproducible example 编辑您的问题
  • 我刚刚分享了一小部分数据。请检查。
  • @user20650 - 我想要在 R 中。谢谢

标签: r matrix merge


【解决方案1】:

使用base R(本质上是一个重塑技巧):

#convert to sparse format
DF_1 <- data.frame(cbind(which(!is.na(Data1), arr.ind = T), val_1 = Data1[!is.na(Data1)]))
DF_2 <- data.frame(cbind(which(!is.na(Data2), arr.ind = T), val_2 = Data1[!is.na(Data2)]))

#add row and column names
DF_1[, "row"] <- row.names(Data1)[DF_1[, "row"]]
DF_1[, "col"] <- colnames(Data1)[DF_1[, "col"]]

DF_2[, "row"] <- row.names(Data2)[DF_2[, "row"]]
DF_2[, "col"] <- colnames(Data2)[DF_2[, "col"]]

#merge without losing information from either matrix
merge(DF_1, DF_2, by = c("row","col"), all.x = T, all.y = T)

          row     col     val_1     val_2
1  DB00006 DB00006 1.0000000        NA
2  DB00006 DB00014 0.8139535        NA
3  DB00006 DB00035 0.8205128        NA
4  DB00006 DB00050 0.7976190        NA
5  DB00006 DB00091 0.6075949        NA
...
93 DB00122 DB07465        NA 0.7325581
94 DB00122 DB07702        NA 0.7325581
95 DB00122 DB07768        NA 0.6835443
96 DB00122 DB07886        NA 0.5617978
97 DB00122 DB08298        NA 0.8028169
98 DB00122 DB08567        NA 0.5617978

请注意,如果您的两个矩阵都是对称的,那么您可以更聪明:

DF_1 <- data.frame(cbind(which(lower.tri(Data1), arr.ind = T), val_1 = Data1[lower.tri(Data1)]))
DF_2 <- data.frame(cbind(which(lower.tri(Data2), arr.ind = T), val_2 = Data1[lower.tri(Data2)]))

作为第一行

【讨论】:

  • 谢谢克里斯,我想我确实需要下三角形,因为我的数据是对称的,当我没有使用它时,我得到了重复,我的笔记本电脑崩溃了。我将尝试此解决方案并返回。
  • 嘿,合并后,我需要添加重复行的值并删除单个行。我可以为此使用聚合或 ddply 吗?
  • 我尝试了解决方案,但遇到了内存错误。有没有一种内存有效的方法来做到这一点?
  • @Anurag 哪个步骤导致错误,您有多少 RAM?
  • 合并步骤导致错误。我有 8Gb 的 RAM
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多