繁体   English   中英

如何在 R 中将一个分类变量转换为多个虚拟变量?

[英]How do convert a categorical variable into multiple dummy variables in R?

在这里,我有一个列名为 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

有人能帮我一下吗?

提前谢谢了。

您可以使用嵌套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

正如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

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

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

如果您想要一个虚拟变量(即 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM