我有一个数据集,其中的教育变量是从1到18的数字编码,每个数字代表一个不同的教育资格。我想创建一个新的变量,其中将有五个类别,从没有资格到研究生。在这五个类别中的每一个类别中,我想将一些旧的教育资格合并为一个。例如,我希望1,2,3 =中学教育。
发布于 2021-03-19 00:10:46
使用一些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
中,您需要的最后一件事是,如果所有条件检查都不成立,则放置该值。在上面的例子中,我使用了"Uknown“。
我建议避免跳过显式命名"Category5“的条件的倾向,并将其用作”如果上面的任何其他事情都不是真的“值,就像有些人所做的那样。如果您这样做,您将冒着空白或超出范围的值被转换为"Category 5“的风险,因此,如果您选择按类别或诸如此类的方法计算记录数,将无法进行可靠的错误检查。
发布于 2021-03-19 00:27:54
这是base R的另一个选择,它不如Pake的dplyr解决方案优雅,但如果你还不熟悉tidyverse语言,它可能会更容易理解。
##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岁之间的任何教育水平都应该被指定为‘研究生’作为它的教育组。”小心点,-Sean
发布于 2021-03-19 00:23:52
尝试如下所示的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"))
https://stackoverflow.com/questions/66694601
复制相似问题