将子矩阵的值分配给更大的矩阵
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
中的最终值。
我有一堆小矩阵,它们基本上是一个较大矩阵的子集,但具有不同的值。我想从这些子矩阵中获取值并覆盖较大矩阵中的相应值。例如,假设这是我更大的矩阵:
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
中的最终值。