マトリックスで複数の置換を行いたい。例えば、
x <-sample(1:20,50,rep=T)
replace(x, x == 4, 2)
replace を使用して、x の 4 に等しい要素を 2 に置き換えます。しかし、どうすれば 、 、 と置き換えること x == 4
が2
できx ==3
ますか。4
x == 5
6
(4,3,5)
それぞれを置き換えるビルド関数はあります(2,4,6)
か?
マトリックスで複数の置換を行いたい。例えば、
x <-sample(1:20,50,rep=T)
replace(x, x == 4, 2)
replace を使用して、x の 4 に等しい要素を 2 に置き換えます。しかし、どうすれば 、 、 と置き換えること x == 4
が2
できx ==3
ますか。4
x == 5
6
(4,3,5)
それぞれを置き換えるビルド関数はあります(2,4,6)
か?
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
あなたはこれを行うことができます:
find <- c(4,3,5)
replace <- c(2,4,6)
found <- match(x, find)
ifelse(is.na(found), x, replace[found])
または、を使用して同様plyr
の実装を使用するを使用します。mapvalues
match
library(plyr)
mapvalues(x, find, replace, warn.missing = FALSE)
どちらの方法も、あらゆる種類のデータで機能します。文字ベクトルの場合、因子に変換してレベルを並べ替えることもできます。