Заменить матричные элементы на основе имен столбцов и строк - PullRequest
0 голосов
/ 06 мая 2018

У меня есть матрица элементов с числовыми значениями, например ::10000

> mtx <- as.matrix(read.csv("matrix.csv", header = TRUE, row.names = 1,sep = ","))
> head(mtx)

     BE   BG   EE   ES   FI
BE 0.00 0.75 0.17 0.28 0.48
BG 0.75 0.00 0.92 1.03 1.24
EE 0.17 0.92 0.00 0.11 0.31
ES 0.28 1.03 0.11 0.00 0.20

Я хочу заменить значения в определенных элементах на ноль на основе имен столбцов и строк. А именно, я хочу иметь ноль, когда столбец «BE» пересекается со строкой «ES», и наоборот, то есть когда столбец «ES» пересекается со строкой «BE», поэтому я хочу получить:

     BE   BG   EE   ES   FI 
BE 0.00 0.75 0.17 0.00 0.00 
BG 0.75 0.00 0.92 1.03 1.24 
EE 0.17 0.92 0.00 0.11 0.31 
ES 0.00 1.03 0.11 0.00 0.00

Я должен выполнить эту операцию для многих матриц, которые больше, чем в этом примере, поэтому есть> 150 пар, для которых требуется замена. Вот структура данных . Замена необходима для: c('BE', 'FI', 'FR', 'DE', 'IE', 'NL', 'NO', 'SE', 'CH', 'GB', 'DK','PT','ES')

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

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Ответ Акруна великолепен. Я добавил свое решение здесь и надеюсь, что оно поможет.

Матрица может управляться фильтрацией имен строк и имен столбцов по набору имен.

Например:

a=matrix(1:9,3,3)
dimnames(a) <- list(c("x","y","z"),c("x","y","z"))
a[(rownames(a) %in% c("a")), colnames(a) %in% c("d")] <- 0

Но я думаю, что вы хотите иметь ноль в некоторых диагональных позициях; поэтому решение для этого будет:

a <- matrix(1:9,3,3)
dimnames(a) <- list(c("x","y","z"),c("x","y","z"))

rows <- c("x","z")
ind <- which(rownames(a) %in% rows)

diag(a)[ind] <- 0
0 голосов
/ 06 мая 2018

Поскольку диагонали равны нулю, мы могли бы поднастроить строки / столбцы и присвоить его 0

 mtx[c("BE", "ES"), c("ES", "BE")] <- 0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...