Я хочу кратко и просто классифицировать годы рождения.Я попробовал cut
, который уже выглядит довольно хорошо.Тем не менее, я еще не мог решить это идеально.
Учитывая две выборки года рождения
set.seed(42)
s.even <- sample(2000:2015, 100, replace=TRUE)
s.odd <- sample(1998:2017, 100, replace=TRUE)
С "четной" выборкой, вывод вполне удовлетворительный:
df.even <- data.frame(birthyear=s.even,
category=cut(s.even, 3,
labels=c("youth", "young", "youngsters")))
> with(df.even, ftable(category, birthyear))
birthyear 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
category
youth 8 4 5 7 5 4 0 0 0 0 0 0 0 0 0 0
young 0 0 0 0 0 0 7 5 6 6 8 0 0 0 0 0
youngsters 0 0 0 0 0 0 0 0 0 0 0 9 4 5 9 8
Но при «нечетной» выборке разрывы не размещаются в нужных местах, т. Е. Я хочу, чтобы первая категория охватывала 1998:2005
, а вторая категория 2006:2010
:
df.odd <- data.frame(birthyear=s.odd.s,
category=cut(s.odd.s, 3,
labels=c("youth", "young", "youngsters")))
> with(df.odd, ftable(category, birthyear))
birthyear 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017
category
youth 3 3 10 6 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0
young 0 0 0 0 0 0 0 5 4 4 5 5 7 0 0 0 0 0 0 0
youngsters 0 0 0 0 0 0 0 0 0 0 0 0 0 2 11 9 5 2 8 2
Поэтому я попытался установить точки останова вручную следующим образом:
> cut(s.odd.s, s.odd.s[c(1,
+ which(s.odd.s %% 5 == 0 & !duplicated(s.odd.s)),
+ length(s.odd.s))])
[1] <NA> <NA> <NA> (1998,2000] (1998,2000] (1998,2000] (1998,2000]
[8] (1998,2000] (1998,2000] (1998,2000] (1998,2000] (1998,2000] (1998,2000] (1998,2000]
[15] (1998,2000] (1998,2000] (2000,2005] (2000,2005] (2000,2005] (2000,2005] (2000,2005]
[22] (2000,2005] (2000,2005] (2000,2005] (2000,2005] (2000,2005] (2000,2005] (2000,2005]
[29] (2000,2005] (2000,2005] (2000,2005] (2000,2005] (2000,2005] (2000,2005] (2000,2005]
[36] (2000,2005] (2005,2010] (2005,2010] (2005,2010] (2005,2010] (2005,2010] (2005,2010]
[43] (2005,2010] (2005,2010] (2005,2010] (2005,2010] (2005,2010] (2005,2010] (2005,2010]
[50] (2005,2010] (2005,2010] (2005,2010] (2005,2010] (2005,2010] (2005,2010] (2005,2010]
[57] (2005,2010] (2005,2010] (2005,2010] (2005,2010] (2005,2010] (2010,2015] (2010,2015]
[64] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2010,2015]
[71] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2010,2015]
[78] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2010,2015]
[85] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2010,2015] (2015,2017]
[92] (2015,2017] (2015,2017] (2015,2017] (2015,2017] (2015,2017] (2015,2017] (2015,2017]
[99] (2015,2017] (2015,2017]
Levels: (1998,2000] (2000,2005] (2005,2010] (2010,2015] (2015,2017]
Но 1998
как-то исключены:
> head(s.odd.s)
[1] 1998 1998 1998 1999 1999 1999
В любом случае, возможно, есть возможность установитьв cut()
что я пропустил?Я также хотел бы начать три категории по желанию с "четной" точки останова, то есть 1998:2004
2005:2009
2010:2017
.