7

要素を選択して変更するより短い方法はありますか? たとえば、

y[y < 1] <- y[y < 1]*2

オブジェクトyは 1 行で 4 回参照されます。この繰り返しを減らすことはできますか?

4

3 に答える 3

10

yへの参照の数を1減らす構文を次に示します。

y <- -2:2
y[i] <- y[i <- y < 1] * 10

y
# [1] -20 -10   0   1   2

ただし、実際には、これを行う可能性が高くなります。これは「賢く」はないかもしれませんが、(人間にとって) 解析がはるかに簡単であることは確かです。

i <- y < 2
y[i] <- y[i] * 10
于 2012-10-23T02:05:04.617 に答える
3

これを試して

y <- y*{{y<1} + 1} 

一般に、関数 f を導入できます

f <- function(bool) ifelse(bool, 2, 1)
y <- y * f(y < 1) 

このアプローチは、ジョシュのソリューションよりも少し速いようです

n <- 10000
y <- sample(c(1,-1), n, replace = TRUE)
f1 <- function(y){y[i] <- y[i <- y < 1] * 10; y}
f2 <- function(y){y <- y*{{y<1} + 1}; y} 
benchmark(f1(y), f2(y), replications = 50000)
  test replications elapsed relative user.self sys.self user.child sys.child
1 f1(y)        50000   30.29    2.398    27.427    3.146          0         0
2 f2(y)        50000   12.63    1.000     9.859    2.918          0         0
于 2012-10-23T02:08:41.627 に答える
1

これにより への参照の数は減りませんが、 2 回計算されるyことはなくなります。y>1

y <- ifelse(y<1, y, y *2)

または、y <1 を事前定義することもできます

replacing <- y < 1

次に、行には への明示的な参照が 2 つだけ含まれています。y

y[replacing] <- y[replacing] *2 

y を a に入れると、繰り返されるdata.table回数を(ほぼ)1回減らすことができますy

 library(data.table)
 Y <- data.table(y = y)

 Y[y <1, y := y*2]

原子ベクトルにアクセスしたい場合は、次のyように入力する必要があるため、ほとんどと言います。Y[,y]

于 2012-10-23T02:02:28.310 に答える