R 将输入矩阵转换为用其累积值替换原始元素的输出

R 将输入矩阵转换为用其累积值替换原始元素的输出,r,matrix,R,Matrix,你好,我是R社区的。我正试图在RStudio版本1.3.1073中为Mac编写一个函数,该函数转换矩阵的元素,从而用相同维度的矩阵中的累积频率值替换原始元素 假设我有一个矩阵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

你好,我是R社区的。我正试图在RStudio版本1.3.1073中为Mac编写一个函数,该函数转换矩阵的元素,从而用相同维度的矩阵中的累积频率值替换原始元素

假设我有一个矩阵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
如果我使用
表(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软件包。我的方法应该是什么


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

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

M1 <- M
M1[] <- cumsum(table(M))[as.character(M)]
使用
cumsum
,属性
被删除,但它仍然是一个命名的
向量

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" ...

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

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

M1 <- M
M1[] <- cumsum(table(M))[as.character(M)]
使用
cumsum
,属性
被删除,但它仍然是一个命名的
向量

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" ...

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

感谢@akrun捕捉到输出中的错误,我已更新了我的问题,以反映这些更改以及由此更正产生的后续值。感谢@akrun捕捉到输出中的错误,我已经更新了我的问题,以反映这些更改,以及由此更正产生的后续值。谢谢,我感谢您的帮助。我已经能够将这段代码实现到我的最终产品中,它运行良好,满足了我的需要。你能详细说明一下这是如何工作的吗?我对R比较陌生,想进一步了解您的解决方案对我有效的原因。@Gadao我补充了一些解释。希望对你有帮助谢谢你,我也很感激你的帮助。我已经能够将这段代码实现到我的最终产品中,它运行良好,满足了我的需要。你能详细说明一下这是如何工作的吗?我对R比较陌生,想进一步了解您的解决方案对我有效的原因。@Gadao我补充了一些解释。希望能有帮助