将因子水平重新编码为 R 中的特定数字

Recode levels of a factor to specific numbers in R

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

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

我想做的是让 R 为因子的每个特定级别分配一个数字,然后 return 在转换为数字时分配该数字。例如,如果我想要“从不”= 0、“有时”= 1 和“总是”= 2,那么 R 将 return:

> 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

如果我尝试 运行 上面的代码而不转换为字符,那么它不会 return 我所追求的:

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

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

谢谢!

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

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

-输出

[1] 0 1 2 2 1 0

如果我们也可以return一个factor,那么levels和相应的labels都可以在factor调用中指定[=21] =]

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

您可以定义要查找的正确顺序并使用 match。这将 return 您的值类似于 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