Hello 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软件包。我的方法应该是什么?
感谢您的考虑,非常感谢您的帮助。
答案 0 :(得分:0)
我们可以使用命名向量来匹配“ M”中的值,然后通过赋值替换矩阵中的值
M1 <- M
M1[] <- cumsum(table(M))[as.character(M)]
table
的输出是一个命名的1d向量
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" ...
现在,通过将matrix
与{{1的相应元素进行匹配,可以将任何命名的向量与另一个向量匹配(dim
是具有某些names
属性的向量)。 }}“ M”。在matrix
中,如果我们使用数字值,它将被视为数字索引,即'50'=>第50个元素,54 =>第54个元素。我们通过转换为R
(character
)来避免这种情况。现在,它与向量的相应as.character
匹配以替换这些值。请注意,输出也命名为names
。为了转换为原始矩阵暗淡,请对vector
使用赋值,以便保留属性