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