5

マトリックスで複数の置換を行いたい。例えば、

x <-sample(1:20,50,rep=T)
replace(x, x == 4, 2)

replace を使用して、x の 4 に等しい要素を 2 に置き換えます。しかし、どうすれば 、 、 と置き換えること x == 42できx ==3ますか。4x == 56

(4,3,5)それぞれを置き換えるビルド関数はあります(2,4,6)か?

4

3 に答える 3

7

data.table の回答のクッキングの匂いがしますが、環境ルックアップのアプローチは次のとおりです。

n <-50; set.seed(10)
x <-sample(1:20,50,rep=T) 

inputs <- c(4,3,5) 
outputs <- c(2,4,6)

library(qdap)
lookup(x, inputs, outputs, missing = NULL)

これはベンチマークを求めました:

ここに画像の説明を入力

長さ 10,000 のベクター (10 回の複製):

Unit: microseconds
      expr      min       lq     median        uq       max neval
  LOOKUP() 9875.384 9992.475 10236.9230 10571.405 11588.846    10
 REPLACE()   76.973   85.837    94.7005   104.031   111.961    10
    PLYR()  904.082  924.142   952.8315   973.124  1017.442    10
   MATCH() 1796.034 1825.423  1864.3760  1881.870  1902.396    10
于 2013-04-26T03:23:57.840 に答える
6

あなたはこれを行うことができます:

find    <- c(4,3,5)
replace <- c(2,4,6)
found   <- match(x, find)

ifelse(is.na(found), x, replace[found])

または、を使用して同様plyrの実装を使用するを使用します。mapvaluesmatch

library(plyr)
mapvalues(x, find, replace, warn.missing = FALSE)

どちらの方法も、あらゆる種類のデータで機能します。文字ベクトルの場合、因子に変換してレベルを並べ替えることもできます。

于 2013-04-26T03:58:30.397 に答える