如何解决将浮点数用作索引还是在R中创建因子时可以吗?
| 将浮点数用作索引还是在R中创建因子时可以吗? 我不是用小数点表示数字。这显然是奇数,但是实际上是整数(对用户而言)是整数,但是存储为浮点数。 例如,我经常使用像(1:3)*3
或seq(3,9,by=3)
这样的结构作为索引,但是您会注意到它们实际上是用浮点数而不是整数表示的,即使对我来说,它们实际上是整数。
从文件读取数据时可能还会出现这种情况。如果文件将整数表示为1.0、2.0、3.0等,则R将它们存储为浮点数。
(我在下面发布了一个答案,并举例说明了为什么要小心,但是并不能真正解决上述简单结构是否会引起麻烦的问题。)
(此问题的灵感来自此问题,其中OP创建了整数以用作因子的编码级别,但它们被存储为浮点数。)
解决方法
尽可能使用整数表示总是更好。例如,使用
(1L:3L)*3L
或seq(3L,9L,by=3L)
。
我可以举一个例子,其中浮点表示给出了意外的答案,但这取决于实际进行浮点运算(即,数字的小数部分)。我不知道是否将整数直接存储在浮点中,然后再进行乘法运算(如原始文章中的两个示例一样)是否会引起问题。
这是我有些强迫的示例,显示浮点数可以给出有趣的答案。我将两个3的浮点数表示形式不同;第一个元素并不完全等于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\"
, 诸如“ 9”之类的构造实际上是整数:
> class(1:3)
[1] \"integer\"
使用浮点数作为索引显然需要一些截断:
> foo <- 1:3
> foo
[1] 1 2 3
> foo[1.0]
[1] 1
> foo[1.5]
[1] 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。