создание возрастного диапазона для возрастов - R - PullRequest
0 голосов
/ 07 марта 2019

У меня есть этот фрейм данных:

> set.seed(100)
> df <- data.frame(Age = sample(18:70, 30, replace = TRUE),
                 Sex = sample(0:1, 30, replace =TRUE),
                 stringsAsFactors = FALSE)
> df
   Age Sex
1   34   0
2   31   1
3   47   0
4   20   1
5   42   1
6   43   1
7   61   0
8   37   1
9   46   1
10  27   0
11  51   0
12  64   1
13  32   1
14  39   1
15  58   1
16  53   0
17  28   1
18  36   1
19  37   0
20  54   0
21  46   0
22  55   0
23  46   0
24  57   0
25  40   1
26  27   0
27  58   0
28  64   0
29  47   1
30  32   0

И я хочу создать еще один столбец с возрастным диапазоном для каждого возраста с этими диапазонами:

> df_range <- data.frame(Age_Range = c("Lower than 26", "26 to 30", "31 to 35", "36 to 40", "41 to 45", "46 to 50", "51 to 55", "56 to 60", "61 to 65", "More than 65"),
                 stringsAsFactors = FALSE)
> df_range
       Age_Range
1  Lower than 26
2       26 to 30
3       31 to 35
4       36 to 40
5       41 to 45
6       46 to 50
7       51 to 55
8       56 to 60
9       61 to 65
10  More than 65

Я знаю, что могу сделать это, создав огромную таблицу, в которой первый столбец имеет все возможные возрасты (например, от -1000 до 1000, чтобы избежать выбросов), а второй столбец - диапазон для каждого возраста, также я мог бы это сделать с ifelse() для каждого диапазона. Однако разве нет более эффективного способа? Может быть, что-то вроде ИСТИННОГО VLOOKUP в Excel?

Ответы [ 2 ]

1 голос
/ 07 марта 2019

для резки с равномерным диапазоном, вы можете использовать
df$age_range = cut_width(df$Age,width=5,boundary=0)

0 голосов
/ 07 марта 2019

Использование findInterval, как указано @RLave выше (не set.seed): Вы должны посмотреть на left.open и right.open и настроить их при необходимости.

 df$Agegroup<-findInterval(df$Age,c(0,26,30,35,40,45,50,55,60,65,200))
    library(dplyr)
    df<-df %>% 
      rename(Age_range=Agegroup) %>% 
      mutate(Age_range=as.factor(Age_range))
    levels(df$Age_range)<-c("Lower than 26","26 to 30","31 to 35","36 to 40",
                            "41 to 45","46 to 50","51 to 55","56 to 60","61 to 65",
                            "More than 65")#Kinda tiring

Вывод (усеченный):

   Age Sex     Age_range
1   29   1      26 to 30
2   52   0      51 to 55
3   38   1      36 to 40
4   56   0      56 to 60
5   33   1      31 to 35
6   20   1 Lower than 26
7   40   1      41 to 45
8   31   0      31 to 35
9   43   0      41 to 45
10  50   0      51 to 55
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...