2013-03-02 2 views
2

Я использую Hmisc для подписи имен факторов и имен переменных, и это очень удобно. Но я нашел проблему здесь кодПакет Hmisc изменяет исходные коды от 0: 1 до 1: 2

a <- c(1,0,1,0,1,0,1,0,1,0) 
b <- c("a","b","a","b","a","b","a","b","a","b") 
df.new <- data.frame(a,b) 
library(Hmisc) 
df.new.1 <- upData(df.new,lowernames=TRUE,a=factor(a,labels=c("No","Yes")),b=factor(b,labels=c("No","Yes"))) 

Для символьного вектора отдавания следующего кодирования и метки

str(df.new.1$b) 

Factor w/ 2 levels "No","Yes": 1 2 1 2 1 2 1 2 1 2 

, который прекрасно.

Когда вы смотрите для кодирования и этикеток с использованием ул в первом случае это дает

str(df.new.1$a) 

Factor w/ 2 levels "No","Yes": 2 1 2 1 2 1 2 1 2 1 , 

который является фантастическим! Исходное кодирование 0 1 исчезло. Как я могу исправить эту проблему? Я хотел бы сохранить исходную переменную 0 1 для последующих регрессионных целей. Thanks

+0

Пожалуйста downvote, название неточно и ответ четко указан в документации , – Ista

ответ

3

Как объясняет ответ Джубы, это ожидаемый способ факторов на работу. Тем не менее, если вы действительно хотите, как описательные метки фактора и исходных числовых значения, вы можете добавить значения в качестве атрибута фактора, например,

> a <- c(1,0,1,0,1,0,1,0,1,0) 
> tmp <- a 
> a <- factor(a, labels=c("No","Yes")) 
> attr(a, "values") <- tmp 
> a 
[1] Yes No Yes No Yes No Yes No Yes No 
attr(,"values") 
[1] 1 0 1 0 1 0 1 0 1 0 
Levels: No Yes 
> str(a) 
Factor w/ 2 levels "No","Yes": 2 1 2 1 2 1 2 1 2 1 
- attr(*, "values")= num [1:10] 1 0 1 0 1 0 1 0 1 0 
> attributes(a)$values 
[1] 1 0 1 0 1 0 1 0 1 0 
> 
6

Это не имеет никакого отношения к Hmisc. Это путь факторы создаются в базе R:

R> a <- c(1,0,1,0,1,0,1,0,1,0) 
R> factor(a,labels=c("No","Yes")) 
[1] Yes No Yes No Yes No Yes No Yes No 
Levels: No Yes 
R> str(factor(a,labels=c("No","Yes"))) 
Factor w/ 2 levels "No","Yes": 2 1 2 1 2 1 2 1 2 1 

Как объяснено на странице ?factor справки:

«фактор» возвращает объект класса «„фактор“», который имеет набор целые коды длины 'x' с атрибутом '"levels"' режима 'character' и уникальными ('! AnyDuplicated (.)') Элементами. Если аргумент «упорядочен» является истинным (или используется «упорядоченный()»), результат имеет класс 'c («упорядоченный», «коэффициент»). не

Так что, когда вы используете factor на вашей переменной a, 0 и 1 значения заменяются «Да» и «Нет» вы даете. Внутренне R не манипулирует уровнями при вычислении вещей, а лежащие в основе значения целого числа, которые он приписывал им. Вот почему вы видите серию значений 1 и 2 на выходе str. Эти целые значения предназначены для внутреннего использования R, и вы не должны их беспокоить.

Если вы хотите отслеживать свои значения 0 и 1, вы можете сохранить их, сохранив вашу переменную как целое, например, или, если вам действительно нужен коэффициент, вы можете определить один с «0», и «1» уровни:

R> factor(a,labels=c("0","1")) 
[1] 1 0 1 0 1 0 1 0 1 0 
Levels: 0 1 

Обратите внимание, что даже в этом случае, вы все равно получите ваши лежащие 1/2 значения при использовании str:

R> str(factor(a,labels=c("0","1"))) 
Factor w/ 2 levels "0","1": 2 1 2 1 2 1 2 1 2 1 

Другой способ изменить уровни от " Да "," Нет "," 0 "," 1 ". Вы можете сделать это с levels() функции, например:

R> v <- factor(a,labels=c("No","Yes")) 
R> v 
[1] Yes No Yes No Yes No Yes No Yes No 
Levels: No Yes 
R> levels(v) <- c("0","1") 
R> v 
[1] 1 0 1 0 1 0 1 0 1 0 
Levels: 0 1