【问题标题】:How to create a factor but preserve underlying values, rather than just integer codes?如何创建一个因子但保留基础值,而不仅仅是整数代码?
【发布时间】:2014-05-19 14:04:18
【问题描述】:
a <- factor(2:4, labels=c("a", "b", "c"))
a
## [1] a b c
## Levels: a b c

as.numeric(a)
## [1] 1 2 3

我想删除标签并获取数值 2、3、4,但 as.numeric(a) 的结果是 1 2 3。不要告诉我答案是as.numeric(a) + 1。谢谢。

【问题讨论】:

  • 好吧,这个问题实际上是不可能的。一旦您像 OP 一样指定标签参数,原始值 2、3 和 4 将完全丢失。它们永远消失了,无法恢复(一般意义上)。
  • @Mattrition 放松一下 - 我重新打开了它。
  • 如果底层的值很重要,那么factor是数据结构的错误选择。因素的意义在于,重要的是标签。因子始终存储为映射到标签的(任意)整数代码。
  • @Stata 也许如果您向我们展示了您想要执行此操作的上下文,我们可以建议一种替代方法。

标签: r data-structures label


【解决方案1】:

由于您没有提供任何更广泛的背景说明为什么您要尝试这样做,因此以下内容只是对可能有用的事情的猜测:

a<-factor(2:4, labels=c("a", "b", "c"))
> names(a) <- as.character(2:4)
> a
2 3 4 
a b c 
Levels: a b c
> as.integer(names(a))
[1] 2 3 4

我不能说我以前使用过“命名因子”,坦率地说,这个概念对我来说有点奇怪。

如果您真的不想要一个因素,那么只需这样做:

a <- 2:4
names(a) <- letters[1:3]

可能就够了。

【讨论】:

    【解决方案2】:

    当你想改变因子的水平时,只需使用:

    levels(a) <- c("a"=2,"b"=3,"c"=4)
    

    给出:

    > a
    [1] 2 3 4
    Levels: 2 3 4
    

    正如@joran 在他的回答中显示的那样,使用names 也可以。但是我认为没有特别需要使用as.character

    names(a) <- 2:4
    

    给出:

    > a
    2 3 4 
    a b c 
    Levels: a b c
    

    此外,您可以使用@joran 显示的as.integer


    使用names 参数,您可以为值分配名称。 levels 参数仅用于因子变量。

    例如,当您将矢量设置为:

    a <- 2:4
    names(a) <- letters[1:3]
    

    使用levels(a),给出:NULL

    当你设置你的向量时:

    a <- 2:4
    levels(a) <- c("ab","bc","cd")
    

    使用names(a),得到:NULL

    【讨论】:

    • 重新定义级别是一种解决方案。但是如果很多因素都想重新定义,那就太可怕了。在Stata中,命令“label drop _all”可以删除所有值标签。
    • @stata 为什么要降低因子水平?
    • Stata 和 SAS 都可以,所以我想知道在 R 中怎么做。
    • @stata 你知道,当有几个人试图帮助你时,他们都在问一些版本的“你能提供更多关于你想要做什么的背景吗?”我们得到的唯一回应是“SAS 和 Stata 可以做到,为什么 R 不能?”你更可能只是简单地惹恼人们,而不是真正得到有用的答案。它给人的感觉是真的发牢骚、忘恩负义和要求很高,我敢肯定这不是你的本意。
    • @joran 谢谢大家。我对 Stata、SAS 和 R 非常感兴趣。我已经完成了 SAS 宏和 Stata ado 文件。最近我会写 R 函数。当我今天将标签添加到一个因素时,我认为如果如何删除标签并保留数据框中的基础值。所以我发布了我的问题。更多参与,更多思考。
    【解决方案3】:

    我写了一个名为“lfactors”的包,你可以在这里欣赏它

    a <- lfactor(2:4,levels=2:4, labels=c("a", "b", "c"))
    a
    # [1] a b c
    # Levels: a b c
    # Numeric levels: 2 3 4 
    as.numeric(a)
    # [1] 2 3 4
    

    它还有其他你可能喜欢的功能

    a==3
    # [1] FALSE  TRUE FALSE
    a=="b"
    # [1] FALSE  TRUE FALSE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2020-09-07
      • 2018-11-21
      • 2022-11-15
      • 1970-01-01
      • 2013-01-09
      相关资源
      最近更新 更多