R 将连续数值转换为由区间定义的离散类别

R 将连续数值转换为由区间定义的离散类别,r,r-faq,R,R Faq,我有一个数据框,里面有一个连续的数字变量,月龄(age_mnths)。我想创建一个新的离散变量,根据年龄间隔对年龄进行分类 # Some example data rota2 <- data.frame(age_mnth = 1:170) 我知道有cut功能,但我不能为了离散化/分类而处理它。如果有原因您不想使用cut,那么我不明白为什么剪切可以很好地满足您的需要 # Some example data rota2 <- data.frame(age_mnth = 1:170) #

我有一个数据框,里面有一个连续的数字变量,月龄(age_mnths)。我想创建一个新的离散变量,根据年龄间隔对年龄进行分类

# Some example data
rota2 <- data.frame(age_mnth = 1:170)

我知道有
cut
功能,但我不能为了离散化/分类而处理它。

如果有原因您不想使用
cut
,那么我不明白为什么<代码>剪切可以很好地满足您的需要

# Some example data
rota2 <- data.frame(age_mnth = 1:170)
# Your way of doing things to compare against
rota2$age_gr<-ifelse(rota2$age_mnth<6,rr2<-"0-5 mnths",
                     ifelse(rota2$age_mnth>5&rota2$age_mnth<12,rr2<-"6-11 mnths",
                            ifelse(rota2$age_mnth>11&rota2$age_mnth<24,rr2<-"12-23 mnths",
                                   ifelse(rota2$age_mnth>23&rota2$age_mnth<60,rr2<-"24-59 mnths",
                                          ifelse(rota2$age_mnth>59&rota2$age_mnth<167,rr2<-"5-14 yrs",
                                                 rr2<-"adult")))))

# Using cut
rota2$age_grcut <- cut(rota2$age_mnth, 
                       breaks = c(-Inf, 6, 12, 24, 60, 167, Inf), 
                       labels = c("0-5 mnths", "6-11 mnths", "12-23 mnths", "24-59 mnths", "5-14 yrs", "adult"), 
                       right = FALSE)
#一些示例数据

rota2
rota2$age\u grIt与
cut
稍有不同,因为除非另有规定,间隔在左侧关闭,在右侧打开。但您始终可以编写一个在右侧关闭,在左侧打开的findInterval版本-是的,您可以,您可以使用Other参数调用cut,使其行为类似于findInterval。。。您也可以使用Hmisc的cut2,它有我喜欢的默认值。这里的一个基本错误是在“是”和“否”参数的值中使用赋值运算符
# Some example data
rota2 <- data.frame(age_mnth = 1:170)
# Your way of doing things to compare against
rota2$age_gr<-ifelse(rota2$age_mnth<6,rr2<-"0-5 mnths",
                     ifelse(rota2$age_mnth>5&rota2$age_mnth<12,rr2<-"6-11 mnths",
                            ifelse(rota2$age_mnth>11&rota2$age_mnth<24,rr2<-"12-23 mnths",
                                   ifelse(rota2$age_mnth>23&rota2$age_mnth<60,rr2<-"24-59 mnths",
                                          ifelse(rota2$age_mnth>59&rota2$age_mnth<167,rr2<-"5-14 yrs",
                                                 rr2<-"adult")))))

# Using cut
rota2$age_grcut <- cut(rota2$age_mnth, 
                       breaks = c(-Inf, 6, 12, 24, 60, 167, Inf), 
                       labels = c("0-5 mnths", "6-11 mnths", "12-23 mnths", "24-59 mnths", "5-14 yrs", "adult"), 
                       right = FALSE)
rota2$age_gr<-c( "0-5 mnths", "6-11 mnths", "12-23 mnths", "24-59 mnths", "5-14 yrs",
                 "adult")[
           findInterval(rota2$age_mnth , c(-Inf, 5.5, 11.5, 23.5, 59.5, 166.5, Inf) ) ]