2017-02-02 5 views
0

Я сделаю все возможное, чтобы это объяснить. У меня есть набор данных, из которых я создаю MATIX из одного столбца и сделать tcrossprod на нем, упрощенный набор примеров данных ...Отображение одной матрицы в другую позицию матрицы

key value 
a1 1000 
a2 500 
a3 1500 
a5 200 

Моя проблема возникает как у меня есть другая матрица, которую я хочу масштабирования исходной матрицы, с которой я рассчитал отдельно, упрощенный пример будет ...

a1 a2 a3 a4 a5 
a1 1 5 10 15 50 
a2 5 1 20 25 75 
a3 10 20 1 30 80 
a4 15 25 30 1 100 
a5 50 75 80 100 1 

Я ищу карту вторую матрицы к первому, но я не могу понять, как это можно сделать, я я хочу, чтобы в итоге получились две матрицы, которые я могу умножить вместе, например, первая матрица является результатом trcrossprod, вторая матрица вычисляется отдельно.

Две матрицы не имеют одинаковых размеров, поэтому я искал отображение соответствующих значений второй матрицы в те же размеры, что и первый, поэтому у меня есть простой расчет скалярной матрицы.

v1  v2  v3  v4   a1 a2 a3 a4 a5 
1, 1000000 500000 1500000 200000  a1 1 5 10 50 
2, 500000 250000 750000 100000  a2 5 1 20 75 
3, 1500000 750000 2250000 300000  a3 10 20 1 80 
4, 200000 100000 300000 40000  a5 50 75 80 1 

Так ключи первой матрицы необходимо отобразить на второй в правильном положении, так что я могу сделать простое масштабирование * матрица matrix_1 matrix_2.

Я бы тогда получить новую матрицу, которая выглядит следующим образом ...

v1  v2  v3  v4 
1, 1000000 2500000 15000000 10000000 
2, 2500000 250000 15000000 7500000 
3, 15000000 15000000 2250000 24000000 
4, 10000000 7500000 24000000 40000 
+0

Итак, если я правильно понимаю, вы хотите, чтобы подмножество второй матрицы, чтобы удалить четвертую строку и столбец? – Roland

+0

Да, мне нужно подмножить вторую матрицу, чтобы она соответствовала измерениям первой, но вторая матрица не имеет реального правила в отношении того, что я могу удалить, она основана на ключе, который у меня есть в первой матрице, поэтому мне нужно отобразить атрибуты второго для первого. – antimuon

+0

'm2 [rownames (m2)% in% m1 [," key "], colnames (m2)% in% m1 [," key "]]' – Roland

ответ

1
# Reproduce data 
df1 <- read.table(header = TRUE, text = "key value 
a1 1000 
a2 500 
a3 1500 
a5 200") 
v1 <- as.matrix(df1[, 2, drop = FALSE]) 
rownames(v1) <- df1[[1]] 
m1 <- v1 %*% t(v1) 

#   a1  a2  a3 a5 
# a1 1000000 500000 1500000 2e+05 
# a2 500000 250000 750000 1e+05 
# a3 1500000 750000 2250000 3e+05 
# a5 200000 100000 300000 4e+04 

m2 <- as.matrix(read.table(header = TRUE, text = " a1 a2 a3 a4 a5 
a1 1 5 10 15 50 
a2 5 1 20 25 75 
a3 10 20 1 30 80 
a4 15 25 30 1 100 
a5 50 75 80 100 1")) 


m1 * do.call("[", c(list(m2), dimnames(m1))) 

#   a1  a2  a3  a5 
# a1 1.0e+06 2.5e+06 15000000 1.0e+07 
# a2 2.5e+06 2.5e+05 15000000 7.5e+06 
# a3 1.5e+07 1.5e+07 2250000 2.4e+07 
# a5 1.0e+07 7.5e+06 24000000 4.0e+04 
+0

Спасибо за это! Мне нужно проверить это решение на правильных данных, но это выглядит очень многообещающим! – antimuon

+0

Я получаю матрицу na, когда я применяю код к моим матрицам ... когда я смотрю на данные отдельно, я не вижу проблемы, но «сопоставление» списка с тусклыми изображениями, похоже, не происходит правильно ... У меня есть concatonated ключ, у которого есть пробел ... может это вызвать проблемы? key_1 0,25 key_1 0,5 key_1 1 key_1 10 key_1 15 key_1 2 key_1 20 key_1 3 key_1 30 key_1 5 key_2 0,25 key_2 0,5 key_2 1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA.1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA.2 NA NA NA NA NA NA NA NA NA NA NA NA NA – antimuon

+0

Это действительно проблема. База R не любит пробелы в именах, она могла бы некорректно использовать 'make.names()'. Возможное быстрое исправление: попробуйте 'gsub (" "," ", key)' везде –

Смежные вопросы