2015-05-28 144 views
1

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

 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 

我有很多子矩阵的值,我用它来覆盖大矩阵中的值,所以想要一种有效的方法。有什么想法吗?

+1

从您的文本中,我不清楚哪些列和行。如果您给出一个示例矩阵和具有实际代码的子矩阵,应该有助于解释您的问题。 – dugar

回答

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