2015-05-28 2 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 row и 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.