Вопрос по r – Как проверить, является ли каждый элемент в векторе целым или нет в R?

9

Скажем, у меня есть вектор y, и я хочу проверить, является ли каждый элемент в y целочисленным или нет, и если нет, остановиться с сообщением об ошибке. Я пробовал is.integer (y), но он не работает.

Это довольно сложный вопрос, чтобы определить, что именно является "целым числом". есть или нет - вам нужно уточнить целое число в смысле «целое число» против целого числа тип данных. Вы редко имеете дело с целочисленным типом данных непосредственно в R (но это то, что проверяет is.integer) - взгляните на is.whole (), предоставленный Мартином Мачлером здесь:stat.ethz.ch/pipermail/r-help/2003-April/032471.html mweylandt
Когда вы останавливаетесь, хотите ли вы знать, где вы остановились ... то есть какой из них не был первым целым числом? Вектор содержит только один тип данных. Таким образом, вы не можете иметь в виду целочисленный тип, только целое число как целое число. Даже это немного проблематично, потому что не все целые числа являются точными целыми числами. Вам также нужна терпимость отклонения от целого числа. Добавьте ответы на эти вопросы к своему вопросу. John

Ваш Ответ

7   ответов
1

которое мы можем использовать в сценариях.

sff <- 5

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

дает

hello

sff <- 'a' дает'a' в результате.

Error: User Rate Limit Exceeded
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

остаток, разделенный на один, был один. Я обнаружил, что мне нужно округлить, прежде чем я взял целое число. Я думаюall из этих тестов потерпит неудачу в том случае, если вы хотите, чтобы вышеупомянутые 89 считались целым числом & Quot; all.equal & quot; Функция предназначена для того, чтобы быть лучшим способом обработки ошибки представления с плавающей точкой, но:

all.equal( 88, 89 );

как в моем случае, дал бы (и сделал) ложный отрицательный результат для проверки целочисленного значения.

РЕДАКТИРОВАТЬ: В бенчмаркинге я обнаружил, что:

(x == as.integer(x)) 

был универсальноbest исполнитель.

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

обычно работал хорошо, часто так же быстро.

(x %% 1 <= tolerance)

работает, но не так быстро, как другие

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

когда вектор не был целым числом, имелterrible производительность (конечно, потому что это связано с проблемой оценки разницы).

identical(x, as.integer(x)) 

когда вектор был целыми значениями, возвращалincorrect результат (при условии, что вопрос предназначен для проверки целочисленных значений, а не целочисленных типов).

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)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededis.integer(2.0)Error: User Rate Limit ExceededFALSEError: User Rate Limit Exceeded
Error: User Rate Limit Exceededidentical()Error: User Rate Limit Exceededall.equal()Error: User Rate Limit Exceededall.equal(3.00000001,3L)Error: User Rate Limit ExceededTRUE.
Error: User Rate Limit Exceededidentical(y, as.integer(y))Error: User Rate Limit ExceededFALSEError: User Rate Limit Exceeded
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
Error: User Rate Limit Exceeded
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")
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededyError: User Rate Limit Exceededc('A', 2, 3, 4)?
6

что и у Джастина, для сравнения каждого числа с этим числом, приведенным к типу «целое число»):

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
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)

РЕДАКТИРОВАТЬ: изменил функцию, поскольку она работала только на символьные векторы.

This works on vectors of the class character as well in case you have a character vector with various number intermixed but that have been coerced to character.

Error: User Rate Limit Exceededint.check("1e6")Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededy<-c(1:1e5, "x") ; )
Error: User Rate Limit Exceededy<-1:1e5; system.time( int.check(y) )Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы