Hmisc包将原始代码从0:1更改为1:2

时间:2013-03-02 22:05:03

标签: r label levels hmisc

我使用Hmisc来标记因子名称和变量名称,这非常方便。 但我发现这里的问题是代码

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查找编码和标签时,它会给出

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变量,以便以后进行回归。 感谢

2 个答案:

答案 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帮助页面中所述:

  

'factor'返回一个类'“factor”'的对象,它有一组   整数使用模式的'“levels”属性编码'x'的长度   'character'和unique('!anyDuplicated(。)')条目。如果争论   'ordered'为true(或'ordered()'使用)结果有class   'c(“有序”,“因素”)'。

因此,当您在变量factor上使用a时,0和1值将替换为您提供的“是”和“否”。在内部,R不会在计算事物时操纵水平,而是它归因于它们的基础整数值。这就是为什么你在str的输出中看到1和2系列值的原因。 这些整数值供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

请注意,即使在这种情况下,使用str时仍会获得基础1/2值:

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

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