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

Convert continuous numeric values to discrete categories defined by intervals

提问人:Aybek Khodiev 提问时间:11/26/2012 最后编辑:HenrikAybek Khodiev 更新时间:8/23/2017 访问量:44949

问:

我有一个带有连续数值变量的数据框,以月为单位的年龄 (age_mnths)。我想创建一个新的离散变量,其年龄类别基于年龄间隔。

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

我已经创建了基于程序(如下),但我相信有可能有更优雅的解决方案。ifelse

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")))))

我知道有函数,但我无法处理它以达到离散/分类的目的。cut

r-常见问题

评论

1赞 IRTFM 4/13/2017
这里的一个基本错误是在“yes”和“no”参数的值中使用赋值运算符

答:

51赞 Dason 11/26/2012 #1

如果有你不想使用的原因,那么我不明白为什么。 对于你想做的事情来说,效果很好cutcut

# 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)
21赞 IRTFM 11/26/2012 #2
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) ) ]

评论

2赞 IRTFM 11/26/2012
除非另有说明,否则它与区间在左侧关闭和在右侧打开略有不同。cut
1赞 Dason 11/26/2012
但是你总是可以写一个在右边关闭,在左边打开的 findInterval 版本 - stackoverflow.com/questions/13482872/......
0赞 IRTFM 5/6/2019
是的,你可以,你可以用其他参数调用cut,使行为是否像findInterval ...你也可以使用 Hmisc 的 cut2,它有我喜欢的默认值。