R分类变量为数字有序值

问题描述

我有一个很大的数据集,其中3个变量按照9个类别(例如“极差”至“极好”)进行编码。我需要将这些数字进行适当的分析。建议我使用as.numeric(),但是,这会随机将1-9分配给比例尺,而不是反映原始的比例尺顺序。例如,“公平”应该放在数字5的中间,但已被随机分配为2。

解决方法

您可以使用包含所有代码及其值的重新编码列表。然后,您可以将列应用于此列表以获取值:

recode_as = list("bad"=-1,"neutral"=0,"good"=1)

data = data.frame(6:10,"A"=c("good","good","neutral","bad","bad"),"B"=c("bad","neutral"),"C"=c("good","bad"))

data$A = unlist(recode_as[as.character(data$A)])
data$B = unlist(recode_as[as.character(data$B)])
data$C = unlist(recode_as[as.character(data$C)])

转换前的数据:

  X6.10       A       B    C
1     6    good     bad good
2     7    good    good good
3     8 neutral     bad good
4     9     bad    good good
5    10     bad neutral  bad

转换后的数据:

  X6.10  A  B  C
1     6  1 -1  1
2     7  1  1  1
3     8  0 -1  1
4     9 -1  1  1
5    10 -1  0 -1
,

以下是说明问题的示例,并提供了一种解决方案。

假设您的数据框中有一列是一个因素(item1):

df <- data.frame(
  item1 = c("extremely bad","very good","very bad"),stringsAsFactors = TRUE
)

如果仅在列as.numeric上使用item1,则将具有:

as.numeric(df$item1)
[1] 2 3 1 5 1 4

这对应于您看似随机(但实际上是字母顺序)的因子水平:

levels(df$item1)
[1] "bad"           "extremely bad" "good"          "very bad"      "very good"

相反,您应该明确指定级别的顺序:

as.numeric(factor(df$item1,levels = c("extremely bad","very bad","extremely good")))
[1] 1 5 3 6 3 2

在这种情况下,“极差”按级别顺序排在第一位,因此被编码为1。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...