Как классифицировать данные коротким и простым способом? - PullRequest
0 голосов
/ 24 декабря 2018

Я хочу кратко и просто классифицировать годы рождения.Я попробовал 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.

...