【问题标题】:How can I replace values in an R matrix matching on rowname, columnname and value如何替换 R 矩阵中匹配行名、列名和值的值
【发布时间】:2019-07-22 20:52:21
【问题描述】:

我有一个非常大的矩阵,我想使用查找表替换其中的值。

我有一个值表(看起来有点像这样):

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 列匹配,将矩阵 Colnames 与目标列匹配,将矩阵值与距离列匹配,然后用最终列替换该值。

矩阵是 4000 x 4000。 表格是 27 x 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"]   

      }

基于这个问题 (Replace all values in a matrix <0.1 with 0) 我可以替换所有匹配特定值或匹配列或行的东西。但我不能一次全部匹配。

当前尝试的有效成分是:

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

您将如何实现这一目标?

【问题讨论】:

  • 你能提供预期的结果吗?

标签: r


【解决方案1】:

用以下物质代替活性成分就可以了。

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))

指定行和列的规则,然后执行应用并将第三个变量放入它自己的函数中。

【讨论】:

  • 这可行,但速度很慢。如果有的话,我想要一个更快的版本。
猜你喜欢
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 2022-11-03
相关资源
最近更新 更多