簡體   English   中英

是否可以使用浮點數作為索引或在 R 中創建因子時?

[英]Is it okay to use floating-point numbers as indices or when creating factors in R?

是否可以使用浮點數作為索引或在 R 中創建因子時?

我不是指帶小數部分的數字。 這顯然是奇數,而是真正是整數的數字(對用戶而言),但被存儲為浮點數。

例如,我經常使用(1:3)*3seq(3,9,by=3)類的結構作為索引,但您會注意到它們實際上表示為浮點數,而不是整數,即使對我來說,它們確實是整數。

另一個可能出現的情況是從文件中讀取數據時; 如果文件將整數表示為 1.0、2.0、3.0 等,R 會將它們存儲為浮點數。

(我在下面發布了一個答案,並舉例說明了為什么要小心,但它並沒有真正解決像上面這樣的簡單結構是否會引起麻煩。)

(這個問題的靈感來自這個問題,其中 OP 創建了整數以用作因子的編碼級別,但它們被存儲為浮點數。)

盡可能使用 integer 表示總是更好。 例如,使用(1L:3L)*3Lseq(3L,9L,by=3L)

我可以舉一個例子,浮點表示給出了一個意想不到的答案,但這取決於實際進行浮點運算(即數字的小數部分)。 我不知道是否將 integer 直接存儲在浮點中,然后可能像原始帖子中的兩個示例那樣進行乘法運算,是否會導致問題。

這是我有點強迫的例子,以表明浮點可以給出有趣的答案。 我做了兩個浮點表示不同的 3; 第一個元素並不完全等於三(無論如何,在我的系統上使用 R 2.13.0)。

> (a <- c((0.3*3+0.1)*3,3L))
[1] 3 3
> a[1] == a[2]
[1] FALSE

創建因子直接按預期工作,因為factor調用as.character對它們具有相同的結果。

> as.character(a)
[1] "3" "3"
> factor(a, levels=1:3, labels=LETTERS[1:3])
[1] C C
Levels: A B C

但是將其用作索引並不能按預期工作,因為當它們被迫使用 integer 時,它們會被截斷,因此它們變為 2 和 3。

> trunc(a)
[1] 2 3
> LETTERS[a]
[1] "B" "C"

諸如1:3之類的結構實際上是整數:

> class(1:3)
[1] "integer"

使用浮點數作為索引顯然需要一些截斷:

> foo <- 1:3
> foo
[1] 1 2 3
> foo[1.0]
[1] 1
> foo[1.5]
[1] 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM