使用 sprintf 舍入矩阵,同时在 R 中保留尾随零

Use sprintf to round a matrix while keeping trailing zeros in R

据我所知,如果在矩阵上使用 sprintf,它将转换为向量,return 转换为向量,在此过程中,去除行名和列名。我想将一个大矩阵四舍五入到小数点后一位,但保留尾随零。这是问题的一个小例子。

tbl <- matrix(c(2.4, 3.97, 1.02, 2.3), 2, 2)
colnames(tbl) <- letters[1:2]
rownames(tbl) <- letters[3:4]

tbl_round <- round(tbl, digits = 1)    
tbl_round
#     a   b
# c 2.4 1.0
# d 4.0 2.3
tbl_round[1,2]
# [1] 1

tbl_sprintf <- sprintf("%.1f", round(tbl, 1))
tbl_sprintf
# [1] "2.4" "4.0" "1.0" "2.3"
tbl_sprintf[3]
# [1] "1.0"

有没有办法舍入一个非常大的 table,(a) 保留尾随零,(b) 不破坏 table 的结构?

我知道我可以将 sprintf 向量放回矩阵并重命名行和列,但我想知道我是否缺少更直接的解决方案。

您可以使用原始矩阵的 dim 属性来指定输出矩阵的 dim 属性:

tbl[] <- `dim<-`(sprintf("%.1f", tbl), dim(tbl))
tbl
#   a     b    
# c "2.4" "1.0"
# d "4.0" "2.3"

注意:在将矩阵传递给 sprintf 之前 round 没有意义。