用另一个因子的最近水平替换一个因子的水平

时间:2012-06-15 18:40:45

标签: r

假设我在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循环来自动化它。

1 个答案:

答案 0 :(得分: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"