检查变量是否包含浮点值

问题描述 投票:0回答:1

在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 floating-point integer number-formatting
1个回答
1
投票

首先要说的是,在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

您可以使用基本 R

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" 
© www.soinside.com 2019 - 2024. All rights reserved.