获取整数原子向量(与数字相对)

时间:2015-09-02 05:20:10

标签: r

我正在从不属于我的人物数据中形成一个data.frame 控制(来自API)。我希望得到的变量得到他们的 最自然的课程,最小的烦恼。具体来说,我想要整数 适当时,变量,而不是数字。

我正在从XML和一个属性中挖掘这些数据 - 让我们调用它 attA - 将整数表示为整数,即没有句点和 尾随零。另一个属性 - 让我们称之为attB - 更多 一般有用且正确,但总是用一个表示数字 小数位,即使它一致为零。 (请注意,数据也可能是个性!)

我的初步方法基于attA并进行处理 type.convert()但现在我想使用attB。从阅读 type.convert() docs,我很惊讶它不会产生整数 所有数据都可以表示为整数。我误读了吗?任何 关于如何在不做一些邪恶的情况下得到我想要的东西的建议 处理字符数据?

attA <- c("1", "2")
str(type.convert(attA))
#>  int [1:2] 1 2

attB <- c("1.0", "2.0")
str(type.convert(attB))
#>  num [1:2] 1 2

unholy <- gsub("\\.0$", "", attB)
str(type.convert(unholy))
#>  int [1:2] 1 2

type.convert() docs的相关位:&#34;给定一个字符向量,它 尝试将其转换为逻辑,整数,数字或复杂,和 失败,将其转换为因子,除非as.is = TRUE。第一种 可以接受所有非缺失值的选择...向量 包含可选的空格,后跟十进制常量 可表示为R整数或来自na.strings的值转换为 。整数&#34;

2 个答案:

答案 0 :(得分:2)

  

通过阅读type.convert()文档,我很惊讶它没有   当所有数据都可以表示为整数时,产生整数。上午   我误读了吗?

我想你可能会。

在某些情况下,将写为123.0的数字转换为123确实会改变其含义:123.0 中的尾随零可能旨在表明它表示测量到的精度值(例如到最接近的十分之一),而不是123(可能只测量到最接近的整数值)。 (See Wikipedia's article on significant figures for a fuller explanation.)因此type.convert()采用适当/保守的方法将123.0(实际上是123.)视为表示数​​值而不是整数值。

作为解决方案,这样的事情怎么样?

type.convert2 <- function(x) {
    x <- sub("(^\\d+)\\.0*$", "\\1", x)
    type.convert(x)
}

class(type.convert2("123.1"))
# [1] "numeric"
class(type.convert2("123.0"))
# [1] "integer"
class(type.convert2("123."))
# [1] "integer"

class(type.convert2("hello.0"))
# [1] "factor"
type.convert2("hello.0")
# [1] hello.0
# Levels: hello.0

答案 1 :(得分:1)

一种方法是在强制转换为整数后对值进行测试,

res <- type.convert(attB)
if (isTRUE(all.equal((tmp <- as.integer(res)), res))) res <- tmp

另一种可能性是使用trunc来测试截断值。

type.convert不会将字符串转换为整数,因为它在C中使用strtol函数,该函数在&#34;。&#34;处停止。然后,在R源代码中,您会看到line,其中res是由strtol生成的转换后的字符串,

if (*endp != '\0') res = NA_INTEGER;

这意味着,如果整个字符串无效,那么它就不是整数。