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