【问题标题】:How do convert a categorical variable into multiple dummy variables in R?如何将分类变量转换为R中的多个虚拟变量?
【发布时间】:2020-08-02 21:31:04
【问题描述】:

这里我有一个列名为 Age = (24 或以下、25 到 34、35 到 44、45 到 54、25 到 34、24 或以下、35 到 44、25 到 34、45 到54)

现在我需要将分类变量“Age”的值转换如下: 24 或以下等于 1, 25 到 34 等于 2, 35 到 44 等于 3, 45 到 54 等于 4

谁能帮帮我?

非常感谢。

【问题讨论】:

  • 标题说你想要虚拟变量,但你的描述说你想要一个从 1 到 4 的因子。哪个陈述是正确的?

标签: r dataframe dplyr tidyverse dummy-variable


【解决方案1】:

您可以使用嵌套的ifelse 语句:

set.seed(12)
df <- data.frame(Age = c(sample(c("24 or under", "25 to 34", "35 to 44", "45 to 54"), 20, replace = T)))
df$Age_new <- ifelse(df$Age == "24 or under", 1,
                     ifelse(df$Age == "25 to 34", 2,
                            ifelse(df$Age == "35 to 44", 3, 4)))

结果:

df
           Age Age_new
1     25 to 34       2
2     35 to 44       3
3  24 or under       1
4     45 to 54       4
5  24 or under       1
6     35 to 44       3
7     45 to 54       4
8     25 to 34       2
9     45 to 54       4
10    35 to 44       3
11 24 or under       1
12    35 to 44       3
13    25 to 34       2
14 24 or under       1
15    25 to 34       2
16    35 to 44       3
17    25 to 34       2
18    25 to 34       2
19    35 to 44       3
20    25 to 34       2

【讨论】:

  • 嗨,克里斯,在数据集中,我有一些年龄范围,例如“24 岁或以下”是多次。我需要将它们同时保存在数据集中。
  • 您的意思是每个年龄段的记录都有多个案例吗?那应该没关系。符合ifelse 语句中条件的每条记录都将被以相同方式处理。
  • 查看编辑后的答案:正如@OTStats ifelse 所指出的,即使数据中存在多个因子级别的标记。
【解决方案2】:

正如 pieterbons 所述,您的 Age 字段实际上已经是一个因素。如果你 将 Age 转换为数字类型,您将拥有数字类别中的数据。

df <- data.frame(Age = c("24 or under", "25 to 34", "35 to 44", "45 to 54"))
df$Age <- as.numeric(df$Age)

您还可以使用您描述的 Age 字段的 虚拟代码 创建一个新字段(如果您有一个字符串变量要转换为因素,但它有一个非常不同的顺序),有多种方法可以做到这一点:

# 1) Base R
df$age_new <- as.numeric(df$Age)


# 2) dplyr
library(dplyr)
df <- df %>% 
  mutate(Age = case_when(Age == "24 or under" ~ 1,
                         Age == "25 to 34"    ~ 2,
                         Age == "35 to 44"    ~ 3, 
                         TRUE                 ~ 4))

#> df
#          Age age_new
#1 24 or under       1
#2    25 to 34       2
#3    35 to 44       3
#4    45 to 54       4

【讨论】:

  • @OTStats,这确实是一个很棒的方法。我喜欢它 。非常感谢。
【解决方案3】:

如果您的列 Age 是一个因素,这实际上会自动发生在屏幕后面(每个值都存储为整数并具有相应的文本标签)。要显式获取这些整数,您可以使用as.numeric()

df <- data.frame(Age = c("24 or under", "25 to 34", "35 to 44", "45 to 54"))

df$Age_cat <- as.numeric(df$Age)

如果级别的顺序与原始顺序不同,您可能会遇到排序问题。在这种情况下,您可以明确设置因子的水平。

【讨论】:

    【解决方案4】:

    如果您想要一个虚拟变量(即 0 或 1),您可以使用 dplyr::if_else 语句为每个类别创建一个新变量:

    library(dplyr)
    
    Age = c("24 or under", "25 to 34", "35 to 44", "45 to 54")
    data.frame(age = Age) %>%
        mutate("24 or under" = if_else(age == Age[1], 1, 0),
               "25 to 34"    = if_else(age == Age[2], 1, 0),
               "35 to 44"    = if_else(age == Age[3], 1, 0),
               "45 to 54"    = if_else(age == Age[4], 1, 0))
    

    如果您想要一个数值,请将您的变量编码为factor,按照您想要的顺序设置级别,然后使用as.numeric

    Age = factor(c("24 or under", "25 to 34", "35 to 44", "45 to 54"),
             levels = c(c("24 or under", "25 to 34", "35 to 44", "45 to 54")))
    
    as.numeric(Age)
    

    【讨论】:

      猜你喜欢
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 2018-03-22
      • 2020-11-28
      • 1970-01-01
      相关资源
      最近更新 更多