簡體   English   中英

用另一個因子的最近水平替換一個因子的水平

[英]replace levels of a factor by nearest levels of another factor

假設我在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循環來自動化它。

首先得到不匹配的水平:

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM