可以使用浮点数作为索引或在R中创建因子吗?
我不是指带小数部分的数字;这显然是奇怪的,但相反,数字实际上是整数(对于用户而言),但是存储为浮点数。
例如,我经常使用像(1:3)*3
或seq(3,9,by=3)
这样的结构作为索引,但你会注意到它们实际上被表示为浮点数,而不是整数,即使我,他们真的是整数。
另一次可能出现的情况是从文件中读取数据;如果文件将整数表示为1.0,2.0,3.0等,则R会将它们存储为浮点数。
(我在下面的答案中给出了一个例子,说明为什么要小心,但如果像上面这样的简单结构会导致麻烦,那么它并没有真正解决。)
(这个问题的灵感来自this question,其中OP创建的整数用作因子的编码级别,但它们被存储为浮点数。)
答案 0 :(得分:4)
尽可能使用整数表示总是更好。例如,使用(1L:3L)*3L
或seq(3L,9L,by=3L)
。
我可以想出一个浮动表示给出意想不到的答案的例子,但它取决于实际进行浮点运算(即,在数字的小数部分)。我不知道是否直接在浮点中存储一个整数,然后可能进行乘法,就像在原始帖子中的两个例子一样,可能会导致问题。
这是我有点被迫的例子,表明浮点数可以给出有趣的答案。我制作两个浮点表示不同的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
但是将它用作索引并不能按预期工作,因为当它们被强制为整数时,它们会被截断,因此它们变为2和3。
> trunc(a)
[1] 2 3
> LETTERS[a]
[1] "B" "C"
答案 1 :(得分:0)
1:3
之类的构造确实是整数:
> class(1:3)
[1] "integer"
使用float作为索引显然需要一些截断:
> foo <- 1:3
> foo
[1] 1 2 3
> foo[1.0]
[1] 1
> foo[1.5]
[1] 1