web-dev-qa-db-fra.com

Code R pour classer l'âge en groupe/bacs/pauses

J'essaie de classer l'âge dans un groupe afin qu'il ne soit pas continu. J'ai ce code: 

data$agegrp(data$age>=40 & data$age<=49) <- 3
data$agegrp(data$age>=30 & data$age<=39) <- 2
data$agegrp(data$age>=20 & data$age<=29) <- 1

le code ci-dessus ne fonctionne pas sous package de survie. Ça me donne:

invalid function in complex assignment

Pouvez-vous me signaler où est l'erreur? data est la base de données que j'utilise. 

10
leian

J'utiliserais findInterval() ici:

Commencez par créer des exemples de données.

set.seed(1)
ages <- floor(runif(20, min = 20, max = 50))
ages
# [1] 27 31 37 47 26 46 48 39 38 21 26 25 40 31 43 34 41 49 31 43

Utilisez findInterval() pour classer votre vecteur "âges".

findInterval(ages, c(20, 30, 40))
# [1] 1 2 2 3 1 3 3 2 2 1 1 1 3 2 3 2 3 3 2 3

Sinon, comme recommandé dans les commentaires, cut() est également utile ici:

cut(ages, breaks=c(20, 30, 40, 50), right = FALSE)
cut(ages, breaks=c(20, 30, 40, 50), right = FALSE, labels = FALSE)
30

Cette réponse fournit deux manières de résoudre le problème en utilisant le package data.table, ce qui améliorerait considérablement la vitesse du processus. Ceci est crucial si l'on travaille avec de grands ensembles de données.

1s Approach : adaptation de la réponse précédente mais en utilisant maintenant data.table + dont labels:

library(data.table)

agebreaks <- c(0,1,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,500)
agelabels <- c("0-1","1-4","5-9","10-14","15-19","20-24","25-29","30-34",
               "35-39","40-44","45-49","50-54","55-59","60-64","65-69",
               "70-74","75-79","80-84","85+")

setDT(data)[ , agegroups := cut(age, 
                                breaks = agebreaks, 
                                right = FALSE, 
                                labels = agelabels)]

2nd Approach : C’est une méthode plus verbeuse, mais elle précise également ce qui se situe exactement dans chaque groupe d’âge:

setDT(data)[age <1, agegroup := "0-1"]
data[age >0 & age <5, agegroup := "1-4"]
data[age >4 & age <10, agegroup := "5-9"]
data[age >9 & age <15, agegroup := "10-14"]
data[age >14 & age <20, agegroup := "15-19"]
data[age >19 & age <25, agegroup := "20-24"]
data[age >24 & age <30, agegroup := "25-29"]
data[age >29 & age <35, agegroup := "30-34"]
data[age >34 & age <40, agegroup := "35-39"]
data[age >39 & age <45, agegroup := "40-44"]
data[age >44 & age <50, agegroup := "45-49"]
data[age >49 & age <55, agegroup := "50-54"]
data[age >54 & age <60, agegroup := "55-59"]
data[age >59 & age <65, agegroup := "60-64"]
data[age >64 & age <70, agegroup := "65-69"]
data[age >69 & age <75, agegroup := "70-74"]
data[age >74 & age <80, agegroup := "75-79"]
data[age >79 & age <85, agegroup := "80-84"]
data[age >84, agegroup := "85+"]

Bien que les deux approches devraient donner le même résultat, je préfère la première pour deux raisons. (a) L'écriture est plus courte et (2) les groupes d'âge sont classés dans le bon sens, ce qui est essentiel pour visualiser les données.

7
rafa.pereira

Supposons que vos âges ont été stockés dans la colonne dataframe intitulée age. Votre structure de données est df et vous souhaitez une nouvelle colonne age_grouping contenant le "compartiment" dans lequel se trouvent vos âges.

Dans cet exemple, supposons que votre âge varie de 0 -> 100 et que vous souhaitiez les regrouper tous les 10 ans. Le code suivant accomplirait cela en stockant ces intervalles dans une nouvelle colonne age grouping:

df$age_grouping <- cut(df$age, c(0:100, 10))
0
Marquistador
myData$age_grp <- myData$age
myData$age_grp <- ifelse((myData$age>=10 & myData$age<=18) , 'minnor',myData$age_grp)
myData$age_grp <- ifelse((myData$age>18 & myData$age<=21) , 'junior',myData$age_grp)
myData$age_grp <- ifelse((myData$age>21 & myData$age<=25) , 'major_1',myData$age_grp)
myData$age_grp <- ifelse((myData$age>25 & myData$age<=30) , 'major_2',myData$age_grp)
myData$age_grp <- ifelse((myData$age>30 & myData$age<=40) , 'major_3',myData$age_grp)
myData$age_grp <- ifelse((myData$age>40 & myData$age<=55) , 'major_4',myData$age_grp)
myData$age_grp <- ifelse((myData$age>55) , 'minnor',myData$age_grp)
myData$age_grp<-as.factor(myData$age_grp)
summary(myData$age_grp)
library(dplyr)
myData <- select(myData, -(age) )
0
user2458922