Как я могу заменить значения в матрице R, совпадающие по имени строки, имени столбца и значению - PullRequest
0 голосов
/ 01 марта 2019

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

У меня есть таблица значений (которая выглядит примерно так):

Origin  Destination  Distance  Final
  1         1           1         A
  1         1           2         B
  1         1           3         E      
  1         2           2         F
  1         3           1         B
  1         3           2         C   
  2         1           1         B
  2         2           1         A
  2         3           3         C
  3         1           1         A
  3         1           2         D
  3         2           1         B
  3         3           2         A    
 ...

и у меня есть матрица, которая выглядит примерно так:

x   1   1   3   1   2    1  ...
1   1   3   2   1   2    1  
1   2   2   1   2   2    1
3   2   1   2   1   1    2
1   3   1   2   1   2    1
2   1   1   3   1   1    1
1   2   2   1   3   1    1

...

Я пытаюсь сопоставить имена строк моей матрицы со столбцом Origin, столбцы Matrix с столбцом Destination и значения матрицы с столбцом Distance, а затем заменить это значение на столбец Final.

Matrix равен 4000на 4000. Таблица 27 на 4

Так что, когда я закончу, это должно выглядеть следующим образом:

     x   1   1   3   1   2    1  ...
     1   A   E   C   A   F    A  
     1   B   B   B   B   F    A
     3   D   A   A   A   B    A
     1   E   A   C   A   F    A
     2   B   B   C   B   A    B
     1   B   B   B   E   A    A
    ...

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

for (i in 1:nrow(CategoryTable)){

      Origin <- CategoryTable[i,"O"]
      Dest <- CategoryTable[i,"D"]
      Distance <- CategoryTable[i,"Dist"]
      Final <- CategoryTable[i,"Final"]

      CategoryGrid[CategoryGrid == Distance][CategoryGrid[row.names(CategoryGrid) %in% Origin,colnames(CategoryGrid) %in% Dest]] <-CategoryTable[i,"Final"]   

      }

Исходя из этого вопроса ( Заменить все значения в матрице <0,1 на 0 </a>), я могу заменить все элементы, соответствующие определенному значению, или элементы, соответствующие столбцу или строке.Но я не могу сопоставить все сразу.

Активный компонент текущей попытки:

CategoryGrid[CategoryGrid == Distance][CategoryGrid[row.names(CategoryGrid) %in% Origin,colnames(CategoryGrid) %in% Dest]] <-CategoryTable[i,"Final"]   

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

Тем не менее, на самом деле я получаю:

Error in CategoryGrid[row.names(CategoryGrid) %in% Origin, colnames(CategoryGrid) %in%  : 
  incorrect number of dimensions

Как бы вы достигли этого?

1 Ответ

0 голосов
/ 01 марта 2019

Заменив активный ингредиент следующим, добились цели.

CategoryGrid[row.names(CategoryGrid) == Origin , colnames(CategoryGrid) == Dest] <- apply(CategoryGrid[row.names(CategoryGrid) == Origin , colnames(CategoryGrid) == Dest], MARGIN=c(1,2),function(x) ifelse(x == Distance, Final, x))

Укажите правила для строк и столбцов, затем примените и поместите третью переменную в свою собственную функцию.

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