【问题标题】:R Categorical Variables to numeric ordered valuesR分类变量到数字有序值
【发布时间】:2020-08-21 04:06:34
【问题描述】:

我有一个大型数据集,其中 3 个变量按 9 个类别进行编码,例如“非常糟糕”到“非常好”。我需要把这些变成适合分析的数字。有人建议我使用as.numeric(),但是,这会将数字 1-9 随机分配给比例,而不是反映原始比例顺序。例如,“公平”应该在中间排在第 5 位,但被随机分配到 2。

【问题讨论】:

  • 想必你的变量是作为因子存储的吧?在这种情况下,请查看this 答案。此外,MCVE 可以更轻松地回答问题。
  • x

标签: r


【解决方案1】:

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

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

data = data.frame(6:10,
                  "A"=c("good","good","neutral","bad","bad"),
                  "B"=c("bad","good","bad","good","neutral"),
                  "C"=c("good","good","good","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

【讨论】:

    【解决方案2】:

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

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

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

    如果您只在item1 列上使用as.numeric,您将拥有:

    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", 
                                           "bad", 
                                           "neutral", 
                                           "good", 
                                           "very good", 
                                           "extremely good")))
    [1] 1 5 3 6 3 2
    

    在这种情况下,“非常糟糕”在级别顺序中排在第一位,因此编码为 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多