2015-12-18 2 views
-1

Я пытаюсь сделать переменную фактора из числовой переменной в R. Я хотел бы отслеживать NA и новые ящики, которые я создаю. В новых ячейках некоторые цифры имеют допустимый диапазон, а некоторые - нет. Я забочусь о самих бункерах, но хочу создать «недействительный» уровень, в котором будут размещаться все, что не попадает в указанный диапазон.Использование cut(), чтобы сделать коэффициент

Вот пример:

library(reshape) 

fac <- c(-1, 1, 2, 3, 4, 100, NA) 
fac <- cut(fac, c(-Inf, 1, 2, 3, Inf)) 
fac <- addNA(fac) 
combine_factor(fac, 
      variable=order(levels(fac))[c(2,3,5)], 
      other.label = "Invalid") 

Что бы дать мне выход, который будет иметь уровни, которые я хочу быть интервалы, NA или недействительным.

Однако проблема в том, что я не хочу кодировать переменную с помощью чисел, потому что у меня есть несколько разных наборов данных, и не все из них содержат каждый уровень фактора.

Если изменить переменную так, что она не содержит какой-либо определенного уровня фактора:

fac <- c(-1, 1, 3, 4, 100, NA) 

я получаю ошибку:

Error in factor(nvar[as.numeric(fac)], labels=c(levels(fac)[variable], : invalid 'labels'; length 4 should be 1 or 3.

Выход 1 (который работает, потому что у меня нет уровней, происходящих 0 раз):

[1] (1,2] (1,2] (2,3] <NA> Invalid Invalid Invalid 
Levels: (1,2] (2,3] <NA> Invalid 

Выход 2 (где один уровень: (1,2] имеет 0 occurren ces):

[1] (2,3] <NA> Invalid Invalid Invalid 
Levels: (1,2] (2,3] <NA> Invalid 

Второй сценарий - это то, где я испытываю ошибку.

Есть ли способ обойти эту ошибку?

+0

Что такое 'combine_factor' функция? Откуда это? – A5C1D2H2I1M1N2O1R2T1

+0

Его из пакета изменения. – dc3

+3

Просьба указать желаемый результат для обоих тестов. – A5C1D2H2I1M1N2O1R2T1

ответ

2

Я много о функции combine_factor не знаю, но мне кажется, довольно легко написать свой собственный ....

Вот простой пример:

NewLevs <- function(fac, keep, others = "Invalid") { 
    lf <- levels(fac) 
    nl <- c(setNames(as.list(lf[keep]), lf[keep]), 
    setNames(as.list(lf[-keep]), rep(others, length(lf)-length(keep)))) 
    levels(fac) <- nl 
    fac 
} 

Вот некоторые примерные данные:

fac1 <- c(-1, 1, 2, 3, 4, 100, NA) 
fac1 <- addNA(cut(fac1, c(-Inf, 1, 2, 3, Inf))) 

fac2 <- c(-1, 1, 3, 4, 100, NA) 
fac2 <- addNA(cut(fac2, c(-Inf, 1, 2, 3, Inf))) 

Поместите функцию работы:

fac1 
# [1] (-Inf,1] (-Inf,1] (1,2] (2,3] (3, Inf] (3, Inf] <NA>  
# Levels: (-Inf,1] (1,2] (2,3] (3, Inf] <NA> 
NewLevs(fac1, c(2, 3, 5)) 
# [1] Invalid Invalid (1,2] (2,3] Invalid Invalid <NA> 
# Levels: (1,2] (2,3] <NA> Invalid 


fac2 
# [1] (-Inf,1] (-Inf,1] (2,3] (3, Inf] (3, Inf] <NA>  
# Levels: (-Inf,1] (1,2] (2,3] (3, Inf] <NA> 
NewLevs(fac2, c(2, 3, 5)) 
# [1] Invalid Invalid (2,3] Invalid Invalid <NA> 
# Levels: (1,2] (2,3] <NA> Invalid 

Нужных уровней плюс метки для нежелательных уровней могут быть изменены:

NewLevs(fac2, c(1, 2, 3), "Wrong") 
# [1] (-Inf,1] (-Inf,1] (2,3] Wrong Wrong Wrong 
# Levels: (-Inf,1] (1,2] (2,3] Wrong 
Смежные вопросы