如何使用旧变量的观察创建新变量?

时间:2021-03-18 15:56:14

标签: r

我有一个数据集,其中教育变量的数字编码为 1 - 18,每个数字代表不同的教育资格。我想创建一个新变量,其中有五个类别,从无学历到研究生。在这五个类别中的每一个类别中,我都想将一些旧的教育资格合二为一。例如,我想要 1,2,3 = 中等教育。

4 个答案:

答案 0 :(得分:2)

使用一些 ifelse 语句可以帮助您实现目标。

使用 dplyr 包的答案:

yourdata%>%
    mutate(New_Category=ifelse(OldCategory %in% c(1,2,3),"Category1",
                    ifelse(OldCategory %in% c(4,7,9),"Category2",
                    ifelse(OldCategory %in% c(5,6,8),"Category3",
                    ifelse(OldCategory %in% c(10,11,12,13,14),"Category4",
                    ifelse(OldCategory %in% c(15,16,17,18),"Category5","Unknown"))))))

您可以灵活地进行分组。本质上,这会检查第一条语句是否为真,如果是,则将“Category1”作为新 New_Category 列的值。如果不是,则继续执行下一个 ifelse 语句。

在嵌套的 ifelse 中,您需要的最后一件事是在没有条件检查为真时放置的值。在上面的例子中,我使用了“未知”。

我建议避免倾向于跳过明确命名“Category5”的条件并将其用作“如果上述其他事情都不为真”值,因为有时人们会这样做。如果您这样做,您将面临空白或超出范围的值被转换为“类别 5”的风险,因此如果您选择按以下方式计算记录数,则将无法进行可靠的错误检查类别之类的。

答案 1 :(得分:2)

这是基础 R 的另一种选择。它不如 Pake 的 dplyr 解决方案优雅,但它确实有效,而且如果您还不熟悉 tidyverse 语言,它可能与基础 R 非常不同,可能更容易理解.

##Creating some Fake Data##
Ed_1<-c(1:18) #Numeric Education Variable
Ed_cat<-c("No_High_School_Diploma","GED_or_High_School_Diploma", "Some_College", "College_Degree", "PostGraduate") #Categorical Education Variable
ED<-data.frame(Education_Level = sample(Ed_1, 100, replace = TRUE)) #A random example dataset

##Creating a new column, and adding categorical data##
ED[,"Education_Group"]<-NULL
ED$Education_Group[ED$Education_Level %in% c(1:3)]<-Ed_cat[1]
ED$Education_Group[ED$Education_Level %in% c(4:7)]<-Ed_cat[2]
ED$Education_Group[ED$Education_Level %in% c(8:11)]<-Ed_cat[3]
ED$Education_Group[ED$Education_Level %in% c(12:15)]<-Ed_cat[4]
ED$Education_Group[ED$Education_Level %in% c(16:18)]<-Ed_cat[5]

##Viewing the results##
ED$Education_Group

诀窍是使用方括号语法,它在 R 中的意思是“选择”,然后使用赋值箭头分配一个新值。

分解这行代码

ED$Education_Group[ED$Education_Level %in% c(16:18)]<-Ed_cat[5]

ED$Education_Group 表示“选择 Education_Group 列作为向量” [ED$Education_Level %in% c(16:18)] 表示“其中同一行中 Education_Level 的对应值在集合 {16,17,18} 中” <-Ed_cat[5] 表示“将这些值分配给 Ed_cat 向量的第五个元素”

用简单的英语,整行代码的意思是“任何 16 到 18 岁之间的教育水平都应该被指定为‘研究生’作为其教育组。” 小心, -肖恩

答案 2 :(得分:1)

试试这样的 case_when 函数:

library(dplyr)
data %>% mutate(new_education = case_when(
      education %in% c(1:3) ~ "Category 1",
      education %in% c(4:6) ~ "Category 2",
      education %in% c(7:9) ~ "Category 3",
      education %in% c(10:12) ~ "Category 4",
      education %in% c(13:15) ~ "Category 5",
      education %in% c(16:18) ~ "Category 6",
      TRUE ~ "No category"))

答案 3 :(得分:0)

通常,为类别聚类分配值的最简单方法是使用 cut 函数。例如

breaks <- c(-Inf, 3, 7, 11, 14, Inf)
labels <- c("No_High_School_Diploma","GED_or_High_School_Diploma", "Some_College", "College_Degree", "PostGraduate")
df$cats <- cut(df$education, breaks = breaks, labels = labels)

注意休息的次数需要n+1个标签的数量