ベクトル内の 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)
}
ベクトル内の 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)
}
コードにいくつかの構文エラーがあります。
使ってみて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
コンソールまたはファイル/接続に出力されます。何も割り当てません。おそらく、これらの要素を -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
私はソリューションを次のものと比較しました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
取る必要がありますfindInterval
。1L
の代わりに比較検討してみてください1
。ほぼ 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 構文を使用して間隔を明確に定義するのと同じレベルの特異性を達成するために、独自の独特でわずかに異なる構文があるようです。
元のアプローチにもう少し似た別のアプローチを次に示します。
library(TeachingDemos)
x <- c(3.2,6,7.8,1,3,2.5)
(x <- ifelse( 2 %<% x %<% 5, -1, x ) )