1

Rに次のデータがあるとしましょう。

training = factor(c(1,1,3,2,1,3,2,34,67,34))
test = factor(c(1,1,2,30,65,30))

(私のデータははるかに複雑です、これは単純化です)

テストセットのレベルがトレーニングセットに存在するかどうかを確認し、存在しない場合はトレーニングセットの最も近い値に置き換えたいと思います。たとえば、テストセットのレベル30と65はトレーニングセットに存在しないため、それぞれ34と67に置き換えたいと思います。

現在、以下のコードを作成しました。

replacefactor <- function(dat,new_factor,near_factor) {
if (!(near_factor %in% levels(dat))){
    levels(dat) <- c(levels(dat),near_factor)
}
dat[dat==new_factor] <- near_factor
dat <- factor(dat)
}

test <- replacefactor(test,30,34)
test <- replacefactor(test,65,67)

動作しますが、レベルを手動で指定する必要があります。データのサイズが大きいため、これは実用的ではありません。

トレーニングセットで最も近い値を見つける方法がわかりません。次に、forループを使用して自動化できます。

4

1 に答える 1

4

最初に一致しないレベルを取得します。

test.missing <- levels(test)[!levels(test) %in% levels(training)]

次に、それらに沿って実行する関数を作成し、最も近い一致を見つけます。

myfun <- function(x, y) {
  levels(y)[which.min(abs(as.integer(levels(y)) - as.integer(x)))]
}

> unlist(lapply(test.missing, myfun, training))
[1] "34" "67"

次に、これを正しいレベルに割り当てることができます。

levels(test)[!levels(test) %in% levels(training)] <- unlist(lapply(test.missing, myfun, training))

> levels(test)
[1] "1"  "2"  "34" "67"
于 2012-06-15T18:52:33.907 に答える