2015-05-28 136 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中的最終值。