将子矩阵的值分配给更大的矩阵

Assigning values from submatrices to larger matrix

我有一堆小矩阵,它们基本上是一个较大矩阵的子集,但具有不同的值。我想从这些子矩阵中获取值并覆盖较大矩阵中的相应值。例如,假设这是我更大的矩阵:

        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

因此,例如,我想从较小矩阵 (2.5) 中的 AB-2000 行和 AB-3500 列的交集获取值,并将其设置为较大矩阵中的新值,并且对子矩阵中的其他值做同样的事情,所以我们得到一个新的更大的矩阵,看起来像:

         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

我有很多子矩阵,我正在使用它们的值来覆盖较大矩阵中的值,因此需要一种有效地执行此操作的方法。有什么想法吗?

您可以利用所有矩阵中行名和列名相等的优势,只需根据子矩阵对大矩阵进行子集化,然后替换值:

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 中的最终值。