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

単一TRUEまたはFALSE全体が必要な場合は、次のように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 に答える