2

我使用 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 变量用于以后的回归目的。谢谢

4

2 回答 2

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"' 类的对象,它具有一组长度为 'x' 的整数代码,具有模式 'character' 的 '"levels"' 属性和唯一性 ('!anyDuplicated(.)')条目。如果参数 'ordered' 为真(或使用 'ordered()'),则结果具有类 'c("ordered", "factor")'。

因此,当您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
于 2013-03-02T22:17:09.757 回答
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
> 
于 2013-03-02T22:36:12.937 回答