【问题标题】:Transform an input matrix into an output that replaces the original elements with their cumulative value将输入矩阵转换为输出,用它们的累积值替换原始元素
【发布时间】:2020-09-15 17:47:57
【问题描述】:

你好 Stack Overflow R 社区。我正在尝试在 Mac 的 RStudio 版本 1.3.1073 中编写一个函数,它转换矩阵的元素,以便在相同维度的矩阵中用它们的累积频率值替换原始元素。

假设我有一个矩阵 M:

matrix(c(50, 50, 54, 61, 50,
         61, 58, 59, 60, 65,
         54, 55, 58, 51, 60,
         58, 59, 66, 62, 51), nrow = 4, ncol = 5, byrow = TRUE) -> M

return(M)
        [,1]   [,2]   [,3]   [,4]   [,5]
[1,]    50     50     54     61     50
[2,]    61     58     59     60     65
[3,]    54     55     58     51     60
[4,]    58     59     66     62     51

如果我使用table(M),那么我会得到这个输出:

table(M)

50 51 54 55 58 59 60 61 62 65 66 
3  2  2  1  3  2  2  2  1  1  1 

此表突出显示 M 中每个元素的频率。每个元素的累积值将是:

50 51 54 55 58 59 60 61 62 65 66 
3  5  7  8  11 13 15 17 18 19 20 

最终,我希望获得这个转换后的矩阵 TM:

return(TM)
     [,1] [,2] [,3] [,4] [,5]
[1,]    3    3    7   17    3
[2,]   17   11   13   15   19
[3,]    7    8   11    5   15
[4,]   11   13   20   18    5

输入矩阵 M 中的每个原始元素都被其计算出的累积值替换为新矩阵 TM 在同一单元格中的输出。

我希望避免使用包,以防我需要在无法访问 Internet 的学校计算机上使用此功能来加载 R 包。我的方法应该是什么?

感谢您的考虑,非常感谢您的帮助。

【问题讨论】:

  • 感谢 @akrun 发现输出中的错误,我更新了我的问题以反映这些变化,以及由此更正产生的后续值。

标签: r matrix


【解决方案1】:

我们可以使用命名向量来匹配'M'中的值,然后通过赋值替换矩阵中的值

M1 <- M
M1[] <- cumsum(table(M))[as.character(M)]

table 的输出是一个命名的一维向量

str(table(M))
#'table' int [1:11(1d)] 3 2 2 1 3 2 2 2 1 1 ...
# - attr(*, "dimnames")=List of 1
#  ..$ M: chr [1:11] "50" "51" "54" "55" ...

使用cumsum,属性table被删除,但它仍然是一个命名的vector

str(cumsum(table(M)))
# Named int [1:11] 3 5 7 8 11 13 15 17 18 19 ...
# - attr(*, "names")= chr [1:11] "50" "51" "54" "55" ...

现在,通过将names 与matrix 'M' 的相应元素匹配,任何命名向量都可以与另一个向量匹配(matrix 是具有一些dim 属性的向量)。在R 中,如果我们使用数值,它将被视为数字索引,即 '50' => 第 50 个元素,54 => 第 54 个元素。我们通过转换为character (as.character) 来避免这种情况。现在,它与向量的相应names 匹配以替换这些值。请注意,输出也是一个名为 vector 的名称。为了转换为原始矩阵dim,请使用[]的赋值,以便保留属性

【讨论】:

  • 谢谢,感谢您的帮助。我已经能够将这段代码实现到我的最终产品中,它运行良好,符合我的需要。你能详细说明这是如何工作的吗?我对 R 比较陌生,想详细了解您的解决方案对我有用的原因。
  • @Gadao 我添加了一些解释。希望对你有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多