私は数値ベクトルを持っています:
x <-c(-18.695, -18.695, 19.477, 0.000, 55.000, 19.477, -18.695, 48.476, 55.000, 37.798, -18.695, 19.477, 37.798, 0.000, -18.695)
levels
関数から返されるレベルが次の因子ベクトル。
y <- c("IV-18_7", "IV00", "IV00orig", "IV19_5", "IV37_8", "IV37_8_yp", "IV48_5", "IV48_5_yp", "IV55")
私は新しい係数ベクトルを構築するために必要z
と同じ長さ、x
が、に記載されているレベルを有するy
、とのようにi番目の要素はz
、z[i]
の「最も類似」要素でy
の対応する要素にx
、x[i]
。言い換えると:
z <-factor(c("IV-18_7", "IV-18_7", "IV19_5", "IV00", "IV55", "IV19_5", "IV-18_7", "IV48_5", "IV55", "IV37_8", "IV-18_7", "IV19_5", "IV37_8", "IV00", "IV-18_7"), levels = y)
この例では、「最も類似している」の意味がかなり明白になるはずです。とにかくx[i]
、要素をy
取得し、「IV」プレフィックスを追加してから「類似」の文字列を追加することで要素が取得されるようにするという考え方です。の四捨五入x[i]
(ただし、残念ながら完全に等しくはありません)であり、最後に数値部分の後に接尾辞がありません。これをRで効率的にコーディングする方法がわかりません。手伝ってもらえますか?
これはあなたをかなり近づけるはずのワンライナーです。
paste0("IV", sub(".", "_", sub("\\.0$", "", sprintf("%04.1f", round(x, 1))), fixed=TRUE))
[1] "IV18_7" "IV-18_7" "IV19_5" "IV00" "IV55" "IV19_5" "IV-18_7" "IV48_5" "IV55"
[10] "IV37_8" "IV-18_7" "IV19_5" "IV37_8" "IV00" "IV-18_7"
次のように動作します。元のベクトルxは、最初の有効数字に丸められます。次にsprintf
、フォーマット「%04.1f」を使用すると、文字数が4未満の場合、結果の先頭に「0」が埋め込まれます。この結果はsub
、ドット(ピリオド)の後に「0」が続くインスタンスをドロップする結果になります。最後に、アウターsub
はドットをアンダースコアに置き換えます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加