我有一堆小矩阵,它们基本上是较大矩阵的子集,但具有不同的值。我想从这些子矩阵中获取值并覆盖较大矩阵中的相应值。例如,说这是我更大的矩阵:
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
我有很多子矩阵,其值用于覆盖较大矩阵中的值,因此需要一种方法来有效地执行此操作。有什么想法吗?
答案 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
中的最终值。