在R语言中,有没有可靠的方法来检查变量是浮点型还是整数值?
我查看了几个建议的解决方案。
is.integer(x)
的 R 帮助文件建议使用 round(x)
函数,如下所示:
is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol
但是,这是检查整数,而不是带浮点的数字。对于
TRUE
的情况,此函数将返回 1.0, 2.0, 3.0, ...
,其中值没有小数部分,但其表示法仍然是浮点数。
令我困惑的是,我还没有找到一个简单的解决方案来在 R 中检查这一点,因为它旨在处理大型(通常是异构)数据表。我需要这个特定的解决方案,因为我对数据应用操作,这些操作取决于其类型,因为整个数据集的潜在数据范围。因此,如果我的算法遇到
1.0, 2.0, 3.0, ...
性质的值,它应该知道特定的操作是适用的。
我尝试使用
sprintf()
将值转换为字符串,然后检查字符串是否包含句点。这有一个明显的问题,即根据说明符格式化数字,因此:
x = 5.0
y = 5
sprintf("%f", x) # "5.000000"
sprintf("%f", y) # "5.000000"
sprintf("%d", x) # "5"
sprintf("%d", y) # "5"
如图所示,没有办法区分它们。
编辑:有关我的应用程序的更多详细信息以及为什么需要此解决方案。
我正在处理大型数据表,因此我不会自己定义数据。我的算法的一部分涉及获取一行数据,递增/递减其值并将其传递给分类器以查找结果的变化。为简单起见,我只考虑数值。就数据的格式化方式而言,不同的数字类型可以进行不同的操作。实值特征可以分步递增/递减,例如
5.0, 4.8, 4.6, 4.4, ...
而整数值特征必须在整个步骤中进行操作,例如5, 4, 3, 2, ...
我想在识别特征的数据类型时计算增量。因此,如果特征值为
32
,算法将以整个步递增/递减。如果特征值为5.9
,算法将以fractional步递增/递减。
问题是当算法遇到浮点值
5.0
时。这表明它在实值域,但根据 R 的功能,它被判断为整数。
如果我找不到解决方案,我将不得不预先定义每个表中每一列的数据类型。
来自 diabetes 数据集的一些示例数据:https://pastebin.com/5FTsaC0g
首先要说的是,在R中,
5
和5.0
之间没有区别。您需要使用 5L
告诉 R 该值是一个整数:
class(5) # numeric
class(5.0) # numeric
class(5L) # integer
但是,听起来您有一个很大的数据集,并且需要确定哪些列仅包含整数,哪些列是数字。我们可以使用
mtcars
作为示例,因为所有值都存储为 numeric()
,但有些实际上是整数(例如齿轮数、马力)。
让我们转换为
tibble
,以便它可以很好地打印列类型:
dat <- dplyr::as_tibble(mtcars)
head(dat, n = 2)
# # A tibble: 6 × 11
# mpg cyl disp hp drat wt qsec vs am gear carb
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
# 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
type.convert()
为您推断列类型:
head(type.convert(dat, as.is = TRUE), n = 2)
# # A tibble: 2 × 11
# mpg cyl disp hp drat wt qsec vs am gear carb
# <dbl> <int> <dbl> <int> <dbl> <dbl> <dbl> <int> <int> <int> <int>
# 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
# 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
或者如果您只想要列类型:
sapply(type.convert(dat, as.is = TRUE), class)
# mpg cyl disp hp drat wt qsec vs am gear carb
# "numeric" "integer" "numeric" "integer" "numeric" "numeric" "numeric" "integer" "integer" "integer" "integer"