【问题标题】:Recode levels of a factor to specific numbers in R将因子的级别重新编码为 R 中的特定数字
【发布时间】:2021-11-07 20:26:51
【问题描述】:

我正在尝试重新编码一些用于在 R 中评分的心理测量量表。 量表通常以因子的形式出现,需要将其转换为数字来计算分数;例如(“从不”= 0,“有时”= 1,“总是”= 2)。

我在获得特定数字方面的成功有限。如果刻度从 1 开始(例如“从不”= 1、“有时”= 2、“总是”= 3),那么一切似乎都正常,但是如果刻度从 0(或 1 以外的其他数字)开始,转换为数字并没有按预期进行。我找到了一个临时解决方案,但它相当麻烦,因为我需要先转换为因子,然后转换为字符,最后转换为数字。

我想要做的是让 R 为因子的每个特定级别分配一个数字,然后在转换为数字时返回该数字。例如,如果我想要 "Never" = 0、"Sometimes" = 1 和 "Always" = 2,那么 R 会返回:

> answers <- c("Never", "Sometimes", "Always", "Always", "Sometimes", "Never")
> some_function(answers)
[1] 0 1 2 2 1 0

我的临时和不太理想的解决方案是执行以下操作:

> as.numeric(as.character(fct_recode(as_factor(answers),
+                             "0" = "Never",
+                             "1" = "Sometimes",
+                             "2" = "Always")))
[1] 0 1 2 2 1 0

如果我尝试在不转换为字符的情况下运行上述代码,那么它不会返回我所追求的:

> as.numeric(fct_recode(as_factor(answers),
+                              "0" = "Never",
+                              "1" = "Sometimes",
+                              "2" = "Always"))
[1] 1 2 3 3 2 1

有谁知道如何更有效地转换因子变量数值并将特定数值分配给因子的水平?

谢谢!

【问题讨论】:

    标签: r type-conversion recode


    【解决方案1】:

    R 中,索引从 1 开始,并且因子值也存储为整数。因此,当我们用as.integer 强制转换为整数时,它只返回从 1 开始的索引。我们可以使用命名向量来匹配和替换

    unname(setNames(0:2, c("Never", "Sometimes", "Always"))[answers])
    

    -输出

    [1] 0 1 2 2 1 0
    

    如果我们也可以返回factor,那么levels 和对应的labels 都可以在factor 调用中指定

    factor(answers, levels = c("Never", "Sometimes", "Always"), labels = 0:2)
    [1] 0 1 2 2 1 0
    Levels: 0 1 2
    

    但是,一旦它被强制为整数,整数存储值将从 1 开始

    as.integer(factor(answers, levels = c("Never", "Sometimes", 
             "Always"), labels = 0:2))
    [1] 1 2 3 3 2 1
    

    相反,我们也可以输入 convert

    type.convert(factor(answers, levels = c("Never", "Sometimes", 
          "Always"), labels = 0:2), as.is = TRUE)
    [1] 0 1 2 2 1 0
    

    【讨论】:

      【解决方案2】:

      您可以定义您要查找的正确顺序并使用match。这将返回您的值,例如 1、2、3,但您可以减去 1 以获得从 0 开始的所需顺序。

      answers <- c("Never", "Sometimes", "Always", "Always", "Sometimes", "Never")
      order <- c('Never', 'Sometimes', 'Always')
      match(answers, unique(answers)) - 1
      #[1] 0 1 2 2 1 0
      

      【讨论】:

        猜你喜欢
        • 2019-07-25
        • 1970-01-01
        • 2017-05-14
        • 2016-10-13
        • 1970-01-01
        • 2021-06-14
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        相关资源
        最近更新 更多