Присвоение значений из подматриц большей матрице

У меня есть куча маленьких матриц, которые в основном являются подмножествами большей матрицы, но имеют разные значения. Я хочу взять значения из этих подматриц и перезаписать соответствующие значения в большей матрице. Например, скажем, это моя большая матрица:

        AB-2000 AB-2600 AB-3500 AC-0100 AD-0100 AF-0200
AB-2000   6.5      NA    -1.8    3.65    -17.96  -26.5
AB-2600    NA     7.18    NA      NA       NA      NA
AB-3500  -1.79     NA     5.4     NA     -4.63     NA
AC-0100   3.65     NA     NA     4.22     9.8      NA
AD-0100 -17.96     NA    -4.63    9.8     5.9      NA
AF-0200 -26.5      NA     NA      NA       NA     4.28

Меньшая матрица может быть просто:

        AB-2000 AB-3500
AB-2000    5.5    2.5
AB-3500    2.5    6.5

Так, например, я хочу взять значение на пересечении строки AB-2000 и столбца AB-3500 в меньшей матрице (2.5) и установить его как новое значение в большей матрице, и сделать то же самое для другие значения в подматрице, поэтому мы получаем новую большую матрицу, которая выглядит так:

         AB-2000 AB-2600 AB-3500 AC-0100 AD-0100 AF-0200
AB-2000    5.5      NA     2.5    3.65   -17.96   -26.5
AB-2600     NA     7.18    NA      NA      NA      NA
AB-3500    2.5      NA     6.5     NA     -4.63    NA
AC-0100    3.65     NA     NA     4.22     9.8     NA
AD-0100  -17.96     NA    -4.63   9.8      5.9     NA
AF-0200  -26.5      NA     NA      NA      NA     4.28

У меня есть много подматриц, значения которых я использую для переопределения значений в большей матрице, поэтому мне нужен способ сделать это эффективно. Какие-нибудь мысли?


person jacobgrindal    schedule 28.05.2015    source источник
comment
Из вашего текста мне непонятно, что такое столбцы и строки. Если вы приведете пример матрицы и подматриц с фактическим кодом, это должно помочь в интерпретации вашего вопроса.   -  person dugar    schedule 29.05.2015


Ответы (1)


Вы можете воспользоваться преимуществом наличия одинаковых имен строк и столбцов во всех матрицах и просто подмножить большую матрицу в соответствии с подматрицей, а затем заменить значения:

X <- read.table(text="        AB-2000 AB-2600 AB-3500 AC-0100 AD-0100 AF-0200
AB-2000   6.5      NA    -1.8    3.65    -17.96  -26.5
AB-2600    NA     7.18    NA      NA       NA      NA
AB-3500  -1.79     NA     5.4     NA     -4.63     NA
AC-0100   3.65     NA     NA     4.22     9.8      NA
AD-0100 -17.96     NA    -4.63    9.8     5.9      NA
AF-0200 -26.5      NA     NA      NA       NA     4.28")
X

x1 <- read.table(text="        AB-2000 AB-3500
AB-2000    5.5    2.5
AB-3500    2.5    6.5")

X[rownames(x1),colnames(x1)] <- x1

Результат:

> X
        AB.2000 AB.2600 AB.3500 AC.0100 AD.0100 AF.0200
AB-2000    5.50      NA    2.50    3.65  -17.96  -26.50
AB-2600      NA    7.18      NA      NA      NA      NA
AB-3500    2.50      NA    6.50      NA   -4.63      NA
AC-0100    3.65      NA      NA    4.22    9.80      NA
AD-0100  -17.96      NA   -4.63    9.80    5.90      NA
AF-0200  -26.50      NA      NA      NA      NA    4.28

Для более чем одной подматрицы вы можете сделать что-то вроде этого:

x2 <- read.table(text="        AB-2600 AC-0100
AB-2600    42    42
AC-0100    42    42") #Fake data

all.sub <- list(x1, x2)

for(x in all.sub) X[rownames(x),colnames(x)] <- x

> X
        AB.2000 AB.2600 AB.3500 AC.0100 AD.0100 AF.0200
AB-2000    5.50      NA    2.50    3.65  -17.96  -26.50
AB-2600      NA    42.1      NA   42.20      NA      NA
AB-3500    2.50      NA    6.50      NA   -4.63      NA
AC-0100    3.65    42.3      NA   42.40    9.80      NA
AD-0100  -17.96      NA   -4.63    9.80    5.90      NA
AF-0200  -26.50      NA      NA      NA      NA    4.28

Просто имейте в виду, что если вы повторяете вхождения [row,col], последняя подматрица в all.sub будет окончательным значением в X.

person Molx    schedule 29.05.2015