具有不同精确度的rbind

时间:2017-04-20 23:19:31

标签: r

我想要使用不同级别的先行词来判断2个向量

r1 = rnorm(100)
r2 = rnorm(100)
rbind(round(quantile(r1),5), round(quantile(r2),2))

rbind将舍入返回到5.如何才能显示正确的舍入?谢谢

2 个答案:

答案 0 :(得分:1)

结果矩阵在第二行中显示四舍五入为5,但该行的值实际上舍入为2.您可以通过自行检查第二行来看到这一点。

set.seed(123)
m1 <- rbind(round(quantile(rnorm(10)), 5), 
            round(quantile(rnorm(10)), 2))

m1
           0%      25%      50%     75%    100%
[1,] -1.26506 -0.53177 -0.07983 0.37801 1.71506
[2,] -1.97000 -0.33000  0.38000 0.65000 1.79000

m1[2, ]
   0%   25%   50%   75%  100% 
-1.97 -0.33  0.38  0.65  1.79

所以答案是:如果你想在控制台中检查矩阵时每行显示不同级别的舍入 - 你不能,但你可以确信这些值是预期的。如果要将每行的矩阵格式化为不同类型的输出,例如文档中的表,则这是一个不同的问题。

答案 1 :(得分:1)

计算/存储的数字与的显示方式之间存在差异。

计算/存储的情况下:当您round一个数字时,您所施加的位数不会与该数字一起存储。也就是说,一旦round完成,没有任何东西可以说它是圆形的,它的历史是干净的。因此,当您存储round(pi,2)时,您存储的浮点数大约为3.14

无论数字有多少有效数字,我都可以显示我想要的数字。我可以打印1e5 5位数字和pi打印1,我施加的数字不限于重要数字。在您的情况下,您将四分位数舍入为2位数,但如果您选择,仍然可以用5打印它们。

您将一些四分位数舍入为5位数,将其他四分位数舍入为2位数,然后将它们组合成一个矩阵。就R而言,它是一个2x5的浮点数矩阵;不知道他们曾经拥有多少位数或有多少位数是显着的,只是它们是浮点数。

好像你希望第一行有5位数,第二行有2位数。当R显示/打印矢量,矩阵或data.frame时,数字(例如,使用options(digits=22)设置)用于显示整个对象,而不是一次显示一行。

您可能正在寻找的是您的数字的特定文字表示。我建议如果你想让它们像行代码那样面向行,你可能会更好:

set.seed(2)
r1 = rnorm(100)
r2 = rnorm(100)
mtx = rbind(quantile(r1), quantile(r2)) # with or without rounding
options(digits=6)
mtx
#            0%       25%       50%      75%    100%
# [1,] -2.45171 -0.855833 -0.140224 0.813804 2.09082
# [2,] -2.09923 -0.793072  0.122728 0.751018 2.11007
t(mapply(function(r,n) sprintf(sprintf("%%0.%df", n), r[[1]]),
         apply(mtx, 1, list), # converts mtx to list of rows, hackish
         list(5, 2)           # the num of digits for each row
        ))
#      [,1]       [,2]       [,3]       [,4]      [,5]     
# [1,] "-2.45171" "-0.85583" "-0.14022" "0.81380" "2.09082"
# [2,] "-2.10"    "-0.79"    "0.12"     "0.75"    "2.11"