2012-09-26 29 views
6

這個問題也許已經回答了,但我沒有看到答案。R:整數與數字

我有一個由數字和缺失值組成的數據集。一行是一個百分比。以下是一組假冒數據,其中AA,BB和CC是列名。這個數據集中的第三行是百分比。

AA BB CC 
    234 432 78 
1980 3452 2323 
91.1 90 93.3 
    34 123 45 

在這種情況下,當我讀出的數據組AA和CC是數字和BB是整數。我猜90.0的某個地方被舍入到了90.如果我沒有指定BB是數字,這會導致基本算術問題嗎?我相信如果dd = 1且ee = 2且都是整數,那麼C語言表示dd/ee = 0,而R表示dd/ee = 0.5。

下面是一系列簡單的數學運算,無論數據是數字還是整數,似乎都表明R中的答案不會更改。儘管如此,我仍然認爲在讀取數據時指定所有變量都是數字是明智的。使用谷歌我發現一個或兩個數據類型似乎有所作爲,但不是下面的例子。

aa <- c(1,2,3,4,5,6,7) 
bb <- 2 
str(aa) 
str(bb) 

cc <- as.integer(aa) 
dd <- as.integer(bb) 
str(cc) 
str(dd) 

aa/bb 
cc/dd 
aa/dd 
cc/bb 

ee <- aa * aa 
str(ee) 
sum(ee/2) 

ff <- cc * cc 
str(ff) 
sum(ff/2) 

gg <- 4.14 

hh <- ((aa * aa) * gg)/2 
hh 
ii <- ((cc * cc) * gg)/2 
ii 

jj <- (aa * aa)/gg 
jj 
kk <- (cc * cc)/gg 
kk 
jj == kk 

mm <- as.integer(1) 
nn <- as.integer(2) 
mm/nn 

我想我希望再次保證這不是一個簡單的數學問題,但我懷疑它可以。我一直認爲這裏有一個編程的基本規則,但我不確定那是什麼。 (我知道雙精度的概念。)

感謝您提供任何有關基本問題的建議。

回答

7

使用/運算符的分區總是返回一個「數字」,即等價於C「double」。分子和分母首先被強制爲數字,然後完成分割。如果你想使用整數除法,你可以使用%/%。如果你想創建一個整數,那麼你可以使用truncfloor或者你可以使用round(x , 0)或者你可以使用as.integer。這些選項的前兩個和第四個是相同的。即使打印的表示形式顯示爲整數,圓形函數仍然會返回「數字」。我認爲只要您對「雙倍」/「數字」結果感到滿意,您就不必擔心。哎呀,我們甚至允許除以0

你的「AA」變量被歸類爲「數字」儘管被輸入爲一串整數,但假若你使用:

aa <- 1:8 # sequences are integer class. 

這聽起來好像你會不要太驚訝FAQ 7.31