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

时间:2015-05-28 23:16:08

标签: r matrix replace assign submatrix

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

        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

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

1 个答案:

答案 0 :(得分:1)

您可以利用在所有矩阵中具有相等的rownames和colnames,并根据子矩阵将大矩阵子集化,然后替换值:

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