【问题标题】:Converting a vector to factor in R and keeping undeclared levels将向量转换为 R 中的因子并保持未声明的级别
【发布时间】:2017-08-30 14:48:30
【问题描述】:

我想将 R 中的字符向量转换为因子(让我们以 DataCamp Introduction to R 课程中的示例为例),并且想标记一些因子级别。如何避免任何未提及/未声明的级别自动置于 NA?

speed_vector <- c("fast", "slow", "slow", "fast", "insane")

factor_speed_vector <- factor(speed_vector, ordered = TRUE, levels = c("slow", "insane"), labels = c("Speed < 30 mph", "Speed > 100 mph"))

结果

> summary(factor_speed_vector)
 Speed < 30 mph Speed > 100 mph            NA's 
              2               1               2 
> factor_speed_vector
[1] <NA>            Speed < 30 mph  Speed < 30 mph  <NA>            Speed > 100 mph
Levels: Speed < 30 mph < Speed > 100 mph

我如何确保任何未定义的因子水平(如本例中的“快速”)与原始值保持一致,而不是设置为 NA?

编辑: 我之前在这里的评论是由于因子函数中的级别和标签选项的混淆。任何不知道区别的人都可以在这里阅读:Confusion between factor levels and factor labels

【问题讨论】:

  • 你想对一个不是你的因素水平的值做什么?将其添加为新因素?
  • @user 我只是想确保在将向量转换为具有大量因子级别的较大数据集中的因子时,数据不会自动设置为 NA,只是因为我错过了声明一个级别.所以mt1022,标签是什么实际上无关紧要,我只是添加了它们,所以第一条评论不是我为什么不使用factor()而不定义级别的原因。定义级别的原因是我想给它们贴标签。
  • 也许您想从factor_speed_vector &lt;- factor(c("fast", "slow", "slow", "fast", "insane"), ordered = TRUE) 开始以更好地复制您的情况?
  • 那么您是否需要一种方法将向量转换为因子,并自动将级别设置为向量中的所有唯一值?只需使用as.factor()
  • @user;这不起作用,因为您无法在 as.factor 中对级别进行排序和标记

标签: r


【解决方案1】:

使用levelsmatch,您可以执行以下操作。

从一个因子变量开始:

factor_speed_vector <- factor(c("fast", "slow", "slow", "fast", "insane"), ordered = TRUE)

然后,使用match 更改拉取适当索引的变量的级别

levels(factor_speed_vector)[match(c("slow", "insane"), levels(factor_speed_vector))] <-
c("Speed < 30 mph", "Speed > 100 mph")

在这里,match(c("slow", "insane"), levels(factor_speed_vector)) 查找匹配“缓慢”和“疯狂”的因子水平的索引。这些索引用于对级别进行子集化,然后输入新标签。

【讨论】:

    【解决方案2】:

    这适合你吗?

    speed_vector <- c("fast", "slow", "slow", "fast", "insane")
    factor_speed_vector <- factor(speed_vector)
    levels(factor_speed_vector)[factor_speed_vector == "slow"]   <- "Speed < 30 mph"
    levels(factor_speed_vector)[factor_speed_vector == "insane"] <-  "Speed > 100 mph"
    factor_speed_vector
    # [1] fast            Speed < 30 mph  Speed < 30 mph  fast            Speed > 100 mph
    # Levels: fast Speed > 100 mph Speed < 30 mph
    

    【讨论】:

    • 感谢您的回答。我喜欢代码的可读性。我接受了另一个答案,因为在使用更多因子级别的情况下,它需要更少的代码输入。
    【解决方案3】:

    forcats 包有一些很好的辅助函数来处理因素。 fct_recode() 函数可让您手动更改因子水平。您可以指定一系列命名字符向量,其中名称给出新级别,值给出旧级别。 未另行提及的关卡将保持原样。(来自?fct_recode,强调我的)。

    speed_vector <- c("fast", "slow", "slow", "fast", "insane")
    speed_vector
    
    [1] "fast"   "slow"   "slow"   "fast"   "insane"
    
    forcats::fct_recode(speed_vector, "Speed < 30 mph" = "slow", "Speed > 100 mph" = "insane")
    
    [1] fast            Speed < 30 mph  Speed < 30 mph  fast            Speed > 100 mph
    Levels: fast Speed > 100 mph Speed < 30 mph
    

    【讨论】:

    • 感谢您的回答。这个功能看起来真的很方便,也很好地解决了问题。我接受了另一个答案,因为它只使用基础 R。
    【解决方案4】:
    factor_speed_vector = as.factor(speed_vector)
    
    # > levels(factor_speed_vector)
    # [1] "fast"   "insane" "slow"
    
    levels(factor_speed_vector)[3:2] = c("Speed < 30 mph", "Speed > 100 mph")
    
    # > factor_speed_vector
    # [1] fast            Speed < 30 mph  Speed < 30 mph  fast            Speed > 100 mph
    # Levels: fast Speed > 100 mph Speed < 30 mph
    

    【讨论】:

    • 感谢@user。我认为与其他解决方案相比,这个解决方案不是那么灵活,因为它需要显式寻址标签向量中的位置。
    • @m.a.m 我同意,但如果您的因子水平不变,这会更方便。随意接受其他答案。
    猜你喜欢
    • 2016-12-01
    • 2017-05-14
    • 2019-02-21
    • 2014-08-23
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多