说,我有一个向量y,我想检查y中的每个元素是否为整数,如果不是,则停止并显示错误消息。我试过is.integer(y),但它不起作用。
答案 0 :(得分:16)
最简单(也是最快!)的事情可能是这样的:
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")
答案 1 :(得分:9)
y <- c(3,3.1,1,2.3)
(y - floor(y)) == 0
[1] TRUE FALSE TRUE FALSE
或
(y - round(y)) == 0
如果您想要整个TRUE
或FALSE
,请将其放在all()
中,例如:
all((y - round(y)) == 0)
[1] FALSE
答案 2 :(得分:6)
这是另一种方式(使用与Justin相同的技巧将每个数字与强制转换为'整数'类型的数字进行比较):
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
答案 3 :(得分:4)
不确定Tim的方式或方式更快,但是:
> 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)
答案 4 :(得分: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)
编辑:改变了函数,因为它只适用于字符向量。
这适用于类字符的向量,以防你有一个混合了不同数字的字符向量但是已被强制转换为字符。
答案 5 :(得分:1)
检查以下内容有助于我们可以在脚本上使用一个清晰的if条件。
sff <- 5
if(!(is.integer(sff) == is.character(sff))){
sff
} else {
"hello"
}
给出
hello
sff <- 'a'
会将'a'
作为结果。
答案 6 :(得分: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
余数除以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))
当向量是所有整数值时,返回不正确的结果(假设问题是检查整数值,而不是整数类型)。