13

假设我有一个向量 y,我想检查 y 中的每个元素是否为整数,如果不是,则停止并显示错误消息。我试过is.integer(y),但它不起作用。

4

7 回答 7

19

最简单(也是最快!)的事情可能是这样的:

stopifnot( all(y == floor(y)) )

...所以尝试一下:

y <- c(3,4,9)
stopifnot( all(y == floor(y)) ) # OK

y <- c(3,4.01,9)
stopifnot( all(y == floor(y)) ) # ERROR!

如果您想要更好的错误消息:

y <- c(3, 9, NaN)
if (!isTRUE(all(y == floor(y)))) stop("'y' must only contain integer values")
于 2012-04-11T21:40:16.150 回答
10

你可以这样做:

   y <- c(3,3.1,1,2.3)
   (y - floor(y)) == 0
    [1]  TRUE FALSE  TRUE FALSE

或者

   (y - round(y)) == 0

如果你想要一个TRUEFALSE整个东西,把它放进去all(),例如:

   all((y - round(y)) == 0)
    [1] FALSE
于 2012-04-11T21:09:37.113 回答
7

这是另一种方式(使用与贾斯汀相同的技巧,将每个数字与强制转换为“整数”类型的数字进行比较):

R> v1 = c(1,2,3)
R> v2 = c(1,2,3.5)
R> sapply(v1, function(i) i == as.integer(i))
[1] TRUE TRUE TRUE
R> sapply(v2, function(i) i == as.integer(i))
[1]  TRUE  TRUE FALSE

进行测试:

R> all(sapply(v2, function(i) i == as.integer(i)))
[1] FALSE
于 2012-04-11T21:15:13.483 回答
4

不知道蒂姆的方式或这个方式哪个更快,但是:

> x <- 1:5
> y <- c(x, 2.0)
> z <- c(y, 4.5)
> all.equal(x, as.integer(x))
[1] TRUE
> all.equal(y, as.integer(y))
[1] TRUE
> all.equal(z, as.integer(z))
[1] "Mean relative difference: 0.1111111"
> 

或者:

all((z - as.integer(z))==0)
于 2012-04-11T21:11:40.500 回答
2

我走了一个完全不同的方向然后蒂姆(我更喜欢他,尽管我的方法适用于混合向量,它是一个带有整数的字符向量等):

int.check <- function(vect) {
    vect <- as.character(vect)
    sapply(vect, function(x) all(unlist(strsplit(x, ""))%in% 0:9))
}

x <- c(2.0, 1111,"x", 2.4)
int.check(x)

编辑:更改了函数,因为它仅适用于字符向量。

这也适用于类字符的向量,以防您有一个混合了各种数字但已被强制转换为字符的字符向量。

于 2012-04-11T21:13:55.227 回答
1

检查以下内容有助于我们在脚本中使用清晰的 if 条件。

sff <- 5

if(!(is.integer(sff) == is.character(sff))){ 
  sff
} else {
  "hello"
}

hello

sff <- 'a'结果给出'a'

于 2014-05-07T23:08:30.807 回答
0

如果您有浮点表示错误,请尝试:

round( y, TOLERANCE.DIGITS ) %% 1 == 0

在我的应用程序中,我遇到了严重的浮点表示错误,例如:

> dictionary$beta[3]
[1] 89
> floor(dictionary$beta[3])
[1] 88
> as.integer( dictionary$beta )[3]
[1] 88
> dictionary$beta[3] %% 1
[1] 1

余数除以一为一。我发现在取整数之前我必须四舍五入。如果您希望将上述 89 计为整数,我认为所有这些测试都会失败。“all.equal”函数是处理浮点表示错误的最佳方法,但是:

all.equal( 88, 89 );

在我的情况下,会(并且确实)对整数值检查给出假阴性。

编辑:在基准测试中,我发现:

(x == as.integer(x)) 

是普遍表现最好的。

(x == floor(x))
((x - as.integer(x)) == 0)

通常工作得很好,通常也一样快。

(x %% 1 <= tolerance)

有效,但不如其他人快

!(is.character(all.equal(x, as.integer(x)))) 

当向量不是整数时,性能很差(当然是因为估计差异会很麻烦)。

identical(x, as.integer(x)) 

当向量都是整数值时,返回不正确的结果(假设问题是为了检查整数值,而不是整数类型)。

于 2013-11-03T17:09:07.400 回答