使用浮点数作为索引或在R中创建因子可以吗?

使用浮点数作为索引或在R中创建因子可以吗?,r,floating-point,R,Floating Point,使用浮点数作为索引或在R中创建因子可以吗 我指的不是小数部分的数字;这显然是奇数,但实际上数字是整数(对于用户来说),但被存储为浮点数 例如,我经常使用(1:3)*3或seq(3,9,by=3)等结构作为索引,但您会注意到它们实际上被表示为浮点数,而不是整数,尽管对我来说,它们实际上是整数 另一个可能出现这种情况的时候是从文件中读取数据;如果文件将整数表示为1.0、2.0、3.0等,R将它们存储为浮点数 (我在下面发布了一个答案,其中有一个例子说明了为什么要小心,但它并没有真正说明像上面这样的简

使用浮点数作为索引或在R中创建因子可以吗

我指的不是小数部分的数字;这显然是奇数,但实际上数字是整数(对于用户来说),但被存储为浮点数

例如,我经常使用
(1:3)*3
seq(3,9,by=3)
等结构作为索引,但您会注意到它们实际上被表示为浮点数,而不是整数,尽管对我来说,它们实际上是整数

另一个可能出现这种情况的时候是从文件中读取数据;如果文件将整数表示为1.0、2.0、3.0等,R将它们存储为浮点数

(我在下面发布了一个答案,其中有一个例子说明了为什么要小心,但它并没有真正说明像上面这样的简单构造是否会引起麻烦。)


(这个问题的灵感来源于,OP创建了整数用作因子的编码级别,但它们被存储为浮点数。)

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
>foo-foo
[1] 1 2 3
>富[1.0]
[1] 1
>富[1.5]
[1] 1

如果可以,最好使用整数表示法。例如,使用
(1L:3L)*3L
seq(3L,9L,by=3L)

我可以举一个例子,其中浮点表示给出了一个意外的答案,但这取决于实际执行浮点运算(即,在数字的小数部分)。我不知道,如果将整数直接存储在浮点中,然后可能进行乘法(如原始帖子中的两个示例),是否会导致问题

下面是我的一个有点强迫性的例子,说明浮点可以给出有趣的答案。我做了两个在浮点表示法上不同的3;第一个元素并不完全等于三(无论如何,在我使用R2.13.0的系统上)

但是使用它作为索引并不能像预期的那样工作,因为当它们被强制为整数时,它们会被截断,所以它们会变成2和3

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

关于索引-是的,规则是向零非整数索引截断。这在R语言定义手册中有介绍:
> as.character(a)
[1] "3" "3"
> factor(a, levels=1:3, labels=LETTERS[1:3])
[1] C C
Levels: A B C
> trunc(a)
[1] 2 3
> LETTERS[a]
[1] "B" "C"