Замена значений в одной матрице значениями из другой - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь сравнить с матрицами. Когда значения не эквивалентны, я хочу использовать значение из mat2, если оно больше 0; если это ноль, то я хочу значение от mat1. Поскольку код в настоящее время, он, кажется, постоянно возвращает значение mat1.

Вот моя попытка:

mat.data1 <- c(1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1)
mat1 <- matrix(data = mat.data1, nrow = 5, ncol = 5, byrow = TRUE)


mat.data2 <- c(0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 2, 2, 0, 0, 0, 1, 2, 2, 0, 2, 1, 0, 1)
mat2 <- matrix(data = mat.data2, nrow = 5, ncol = 5, byrow = TRUE)

mat3 = if(mat1 == mat2){mat1} else {if(mat2>0){mat2} else {mat1}}

ожидаемый результат должен быть

1   0   1   1   1
0   1   2   1   1
1   1   2   2   0
1   1   1   2   2
1   1   1   0   1

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Вот один из возможных способов сделать это.

mat.data1 <- c(1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1)
mat1 <- matrix(data = mat.data1, nrow = 5, ncol = 5, byrow = TRUE)


mat.data2 <- c(0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 2, 2, 0, 0, 0, 1, 2, 2, 0, 2, 1, 0, 1)
mat2 <- matrix(data = mat.data2, nrow = 5, ncol = 5, byrow = TRUE)


mat3 <- mat1
to_change <- which(mat2 != mat1 & mat2 > 0)
mat3[to_change] <- mat2[to_change]

Это конкретное использование which, по существу, запрашивает местоположения в mat2, которые не равны местоположениям в mat1 И где mat2 больше нуля.Затем вы можете просто сделать подмножество и поместить эти значения в mat3.

Эти выходные данные будут:

> mat3
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    1    1    1
[2,]    0    1    2    1    1
[3,]    1    1    2    2    0
[4,]    1    1    1    2    2
[5,]    1    2    1    0    1
2 голосов
/ 03 июля 2019

Мы можем использовать coalesce

library(dplyr)
out <- coalesce(replace(mat2, !mat2, NA), replace(mat1, !mat1, NA))    
replace(out, is.na(out), 0)

Или, как @Axeman упомянул

coalesce(out, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...