2017-04-20 62 views
0

我想rbind 2個載體不同層次preceision的rbind不同精度等級的

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

rbind返回四捨五入到5。我怎樣才能得到它,以顯示正確的舍入?謝謝

+0

這返回到它應該是什麼。你期待什麼精確的結果? – Jealie

+1

正在強迫一個字符串出來的問題? –

+0

user3022875,答案是否滿足您的需求? SO習慣上通過「接受」其中一個答案來排除一個問題。 – r2evans

回答

1

計算/存儲以及如何顯示是有區別的。

的情況下計算/存儲:當您round一個數字時,您施加的位數不會與該數字一起存儲。也就是說,一旦完成,沒有任何東西可以說明它是圓形的,它的歷史很乾淨。因此,當您存儲round(pi,2)時,您正在存儲的浮點數大約爲3.14

不管有多少有效數字可能有,但是,我可以顯示儘可能多的數字,我想要的。我可以用5位數打印1e5,用1打印pi,我施加的數字不限於重要的數字。在你的情況下,你將四分位數四捨五入到2位數,但是如果你願意,你仍然可以用5打印它們。

您將一些四分位數舍入爲5位數,其他四位數舍入爲2位數,然後將它們集中在一個矩陣中。就R而言,它是一個2x5的浮點數矩陣;沒有關於他們曾經有多少數字或有多少數字有意義的知識,只是他們是浮點數。

看起來像你期望的第一行有5位數字,第二行有2位數字。當R顯示/打印矢量,矩陣或數據幀時,數字(例如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" 
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 

因此,答案是:如果你想展示不同的控制檯檢查矩陣時,每行四捨五入的 - 你不能,但你可以確信的值符合預期。如果您想將每行的矩陣格式化爲不同類型的輸出,例如文檔中的表格,這是一個不同的問題。