Создать новую матрицу на основе предыдущей в R - PullRequest
1 голос
/ 20 февраля 2020

У меня есть следующая матрица:

         >  Mat=matrix(c(1,1,0,1,1,2,1,Inf), nrow=4, ncol=2)
         > Mat
             [,1] [,2]
       [1,]    1    1
       [2,]    1    2
       [3,]    0    1
       [4,]    1  Inf

Я хочу создать новую матрицу на основе приведенной выше матрицы следующим образом: когда значение первого столбца равно второму столбцу, введите то же значение в первом столбце новой матрицы, когда у нас есть два разных значения в обоих столбцах, поместите среднее значение двух значений для первого столбца новой матрицы, а когда значение второго столбца равно Inf, введите значение первого столбца. в первом столбце новой матрицы. Для значений второго столбца новой матрицы, только когда значение второго столбца в первой матрице равно Inf, установите значение равным 0, в противном случае равным 1. Окончательная новая матрица выглядит следующим образом:

      > newMat=matrix(c(1,1.5,0.5,1, 1,1,1,0), nrow=4,ncol=2)
      > newMat
           [,1] [,2]
      [1,]  1.0    1
      [2,]  1.5    1
      [3,]  0.5    1
      [4,]  1.0    0

Как мне создать новую матрицу в R?

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

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

Mat[,1]  <-  rowMeans(Mat)
i1 <- is.infinite(Mat[,2])
Mat[,2] <- +(!i1)
Mat[i1,1] <- 1
1 голос
/ 20 февраля 2020

Расширенные данные примера для иллюстрации случая, когда inf находится в первом столбце;

m <- matrix(c(1, 1, 0, 1, Inf, 1, 2, 1, Inf, 1), ncol=2)
m

     [,1] [,2]
[1,]    1    1
[2,]    1    2
[3,]    0    1
[4,]    1  Inf
[5,]  Inf    1

Решение с использованием базы R:

1.Копия m до new_m

m_new <- m

2. Определите строки, в которых нам нужно изменить значения:

different_values <- m[, 1] != m[, 2]
second_is_inf <- is.infinite(abs(m[, 2]))

3.Применить изменения:

m_new[different_values & !second_is_inf, 1] <- rowSums(m[different_values & !second_is_inf, 1:2])/2

m_new[second_is_inf, 2] <- 0


m_new

Возвращает:

     [,1] [,2]
[1,]  1.0    1
[2,]  1.5    2
[3,]  0.5    1
[4,]  1.0    0
[5,]  Inf    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...