2016-05-24 3 views
1

Как объединить информацию двух матриц, где одна является вспомогательной матрицей другой, но с разной информацией.Как слить информацию о двух матрицах, где одна является вспомогательной матрицей другой, но имеет различную информацию

У меня есть две матрицы (1223x1223) и (7096x7096). Бот этих матриц держится на расстоянии от 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" 
))) 
+0

Возможно, проще изменить обе матрицы в длинном формате (см 'reshape2 :: melt'), поэтому у вас есть три столбца - drug1, drug2 и value. Затем объедините их (см. 'Merge'). – user20650

+0

, так что слияние просто добавит значения из наркотиков1-drug2 отношений? – Anurag

+0

Нет лучшего способа их слияния: это зависит от того, что вы хотите сделать с массивами данных. Почему ваши матрицы имеют разные размеры? Я предполагаю, что каждая строка и столбцы представляют собой один препарат? Почему же тогда одна из матриц больше, чем другая? Это потому, что меньший набор данных содержит информацию, неизвестную для некоторых лекарств? – Erik

ответ

0

Использование базового R (по существу Reshape трюк):

#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)])) 

в качестве первой линии

+0

Спасибо Крис, я думаю, что мне нужен нижний треугольник, так как мои данные симметричны, и когда я его не использовал, у меня были дубликаты и мой ноутбук разбился. Я попробую это решение и вернусь. – Anurag

+0

Эй, после слияния, мне нужно добавить значения повторяющихся строк и удалить отдельные строки. Могу ли я использовать агрегат или ddply для этого? – Anurag

+0

Я попробовал решение, но столкнулся с ошибкой памяти. Есть ли эффективный способ памяти для этого? – Anurag

Смежные вопросы