2017-03-22 95 views
0

所以基本上我正在做一個物理實驗,在我的表中,我希望我的數據四捨五入到與誤差相同的精度,這個誤差被舍入爲1 sig fig。R舍入有效數字

因此,例如,如果我有以下:

angle <- c(4, 4.1, 4.2) 
angle.error <- c(0.024, 0.3, 0.113) 
data <- data.frame(angle,angle.error) 

要我要與落得被四捨五入爲1個SIG圖角度誤差,角度四捨五入到小數點後作爲對應的數角度誤差,給予

angle <- c(4.00, 4.1, 4.2) 
angle.error <- c(0.02,0.3,0.1) 
data <- data.frame(angle, angle.error) 

希望這是有道理的!這是我們教授的用於呈現數據的標準方式,因此我很驚訝我發現它找到正確的方法是多麼困難。任何貢獻將是偉大的!

編輯:

如果我要變成一個UDR這裏說的數據是5列在我的數據幀的6列中的錯誤,我寫:

Conv2 <- function(x) { 
x[6] <- signif(x[6],1) 
exp <- floor(log10(x[6])) 
man <- x[6]/10^exp   
x[5] <- round(x[5], -exp) # Error associated with this line I think 
sapply(seq_along(x[5]), function(i) format(x[i,5], nsmall=-exp[i])) 

return(x) 
} 

當我實現它我得到錯誤 '在FUN(X [[i]],...)中的錯誤:數學函數的非數字參數'

+2

我可能需要一點澄清。您是否使用「1dp」來表示1位有效數字或1位小數位。如果您不使用1dp與1 sig fig交替使用,那麼您的輸出看起來不太正確。此外,你說你想'angle'四捨五入到sigfigs與angle.error相同的數量,但是你的輸出使用兩個sigfigs作爲'angle',而'angle.error'只有一個。 – Benjamin

+0

是的抱歉,我得到了這個錯誤的方式 - 我現在編輯它是有道理的 –

回答

2

這可以用signif()完成。與round()相比,該數字四捨五入到小數位,signif()輪到特定數量的重要位置。

x <- c(1,1.0001,0.00001) 
round(x,1) # rounds to the specified number of decimal places 
signif(x,1) # rounds to the specified number of significant digits 

讓我們將其應用於您的案例。請注意,signif是通過兩個參數矢量化的。

> signif(c(1.111,2.222,3.333),c(1,2,3)) 
[1] 1.00 2.20 3.33 

這將意味着你的情況如下:

angle.error <- c(0.024, 0.3, 0.113) 
cor <- signif(angle.error,1) 

四捨五入的角度稍微困難。我們需要將角度與angle.error_corr的小數位數相同。因此我們將提取這個數字的尾數和指數。

exp <- floor(log10(cor)) 
man <- cor/10^exp 

現在有可能使用指數來調整角度。

angle <- c(4, 4.1, 4.2) 
angle_cor <- round(angle, -exp) 

然而,由於R示出了最精確的雙重的位數和下降尾隨零,這並不得到預期的結果。我們可以用格式的nsmall參數來解決這個問題,但不幸的是它沒有被矢量化。

sapply(seq_along(angle), function(i) format(angle[i], nsmall = -exp[i])) 

哪個應該給你你正在尋找的答案。

+0

@尼克西蒙斯,稍微更新了答案,以便它也描述你的具體情況。 – takje

+0

謝謝你,我放棄了。理想情況下,我希望這是一個UDF,我曾嘗試過。不幸的是,當我實施它時遇到了一個錯誤 - 請參閱我的帖子上的編輯。有任何想法嗎? –

+0

好吧分類了!必須添加exp < - as.matrix(exp) –