【问题标题】:Hmisc package changes original codes from 0:1 to 1:2Hmisc 包将原始代码从 0:1 更改为 1:2
【发布时间】:2013-02-17 06:23:54
【问题描述】:

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

【问题讨论】:

  • 请投反对票,标题不准确,文档中明确说明了答案。

标签: r label levels hmisc


【解决方案1】:

正如朱巴的回答所解释的,这是因素起作用的预期方式。但是,如果您确实需要描述性因子标签和原始数值,则可以将值添加为因子的属性,例如,

> 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
> 

【讨论】:

    【解决方案2】:

    这与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' 和唯一 ('!anyDuplicated(.)') 条目。如果参数 “ordered”为真(或使用“ordered()”)结果有类 'c("ordered", "factor")'.

    因此,当您在变量 a 上使用 factor 时,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多