10

ベクトル内の 2 から 5 までのすべての数値に -1 の値を割り当てようとしています。

if - then ステートメントが機能すると思いました。私はいくつかの問題を抱えています。(2<x<5) が正しいとは思いませんが、R で中間に書き込む方法がわかりません。ありがとう

x <- c(3.2,6,7.8,1,3,2.5)
if (2<x<5){
    cat(-1)
} else {
    cat (x)
}
4

5 に答える 5

25

コードにいくつかの構文エラーがあります。

使ってみてfindInterval

x[findInterval(x, c(2,5)) == 1L] <- -1
x
## [1]  -1.0  6.0  7.8  1.0 -1.0 -1.0

?findIntervalの使用に関する詳細を読むfindInterval

使用することもできますreplace

replace(x, x > 2 & x < 5, -1)

ご了承ください

  • 2<x<5あなたが書く必要があるのでx > 2 & x < 5
  • catコンソールまたはファイル/接続に出力されます。何も割り当てません。
于 2012-10-18T02:10:57.713 に答える
13

おそらく、これらの要素を -1 に置き換えたいだけでしょう。

> x[x > 2 & x < 5] <- -1; x
[1] -1.0  6.0  7.8  1.0 -1.0 -1.0

を使用することもできますifelse

> ifelse(x > 2 & x < 5, -1, x)
[1] -1.0  6.0  7.8  1.0 -1.0 -1.0
于 2012-10-18T02:16:32.363 に答える
3

私はソリューションを次のものと比較しましたmicrobenchmark

library(microbenchmark)
library(TeachingDemos)

x = runif(100000) * 1000
microbenchmark(200 %<% x %<% 500
               , x > 200 & x < 500
               , findInterval(x, c(200, 500)) == 1
               , findInterval(x, c(200, 500)) == 1L
               , times = 1000L
               )

結果は次のとおりです。

                               expr       min        lq      mean    median        uq       max neval
                  200 %<% x %<% 500 17.089646 17.747136 20.477348 18.910708 21.302945 113.71473  1000
                  x > 200 & x < 500  6.774338  7.092153  8.746814  7.233512  8.284603 103.64097  1000
  findInterval(x, c(200, 500)) == 1  3.578305  3.734023  5.724540  3.933615  6.777687  91.09649  1000
 findInterval(x, c(200, 500)) == 1L  2.042831  2.115266  2.920081  2.227426  2.434677  85.99866  1000

取る必要がありますfindInterval1Lの代わりに比較検討してみてください1。ほぼ 2 倍の速さです。

于 2015-09-24T12:42:29.647 に答える
2

明確に定義された数値間隔に基づいて変数に値を割り当てるための私の好みは、ベース R 構文を使用することです。

 DF$NewVar[DF$LowerLimit <= DF$OriginalVar & DF$OriginalVar < DF$UpperLimit] = "Normal"
 DF$NewVar[DF$LowerLimit < DF$OriginalVar] = "Low"
 DF$NewVar[DF$OriginalVar >= DF$UpperLimit] = "High"

この構文は、多くの R 関数よりも明確であると思います。主な理由は、コードをすばやくカスタマイズして、包括的間隔と排他的間隔を指定できるからです。実際には、間隔を包括的 (つまり [-x から +x]) または排他的 (つまり (-x から +x)) または組み合わせ (つまり [- x から +x))。

さらに、ベース構文は、他の誰かが後でレビューする場合にコードを明確にします。関数のそれぞれの固有のライブラリには、ベース R 構文を使用して間隔を明確に定義するのと同じレベルの特異性を達成するために、独自の独特でわずかに異なる構文があるようです。

于 2018-02-17T21:34:10.843 に答える
1

元のアプローチにもう少し似た別のアプローチを次に示します。

library(TeachingDemos)

x <- c(3.2,6,7.8,1,3,2.5)

(x <- ifelse( 2 %<% x %<% 5, -1, x ) )
于 2012-10-18T15:53:43.427 に答える