it-swarm.com.de

R-Code, um das Alter in Gruppen/Ablagen/Pausen einzuordnen

Ich versuche, das Alter in eine Gruppe einzuordnen, damit es nicht kontinuierlich ist. Ich habe diesen 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

der obige Code funktioniert nicht unter dem Überlebenspaket. Es gibt mir:

invalid function in complex assignment

Kannst du mir zeigen, wo der Fehler liegt? data ist der Datenrahmen, den ich verwende. 

10
leian

Ich würde findInterval() hier verwenden:

Machen Sie zunächst einige Beispieldaten

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

Verwenden Sie findInterval(), um Ihren "Alters" - Vektor zu kategorisieren.

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

Alternativ, wie in den Kommentaren empfohlen, ist cut() auch hier hilfreich:

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

Diese Antwort bietet zwei Möglichkeiten, das Problem mithilfe des Pakets data.table zu lösen, wodurch die Geschwindigkeit des Prozesses erheblich verbessert wird. Dies ist entscheidend, wenn mit großen Datenmengen gearbeitet wird.

1s Ansatz : Anpassung der vorherigen Antwort, jedoch jetzt mit data.table + einschließlich 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 : Dies ist eine wortreichere Methode, macht aber auch klarer, was genau in jede Altersgruppe fällt:

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+"]

Obwohl beide Ansätze dasselbe Ergebnis haben sollten, ziehe ich den ersten aus zwei Gründen vor. (a) Das Schreiben ist kürzer und (2) die Altersgruppen sind in der richtigen Reihenfolge angeordnet, was für die Visualisierung der Daten von entscheidender Bedeutung ist.

7
rafa.pereira

Nehmen wir an, Ihr Alter wurde in der Dataframe-Spalte mit der Bezeichnung age gespeichert. Ihr Datenrahmen ist df, und Sie möchten eine neue Spalte age_grouping mit dem "Bucket", in den Ihr Alter fällt.

Nehmen Sie in diesem Beispiel an, dass Ihr Alter zwischen 0 -> 100 lag und Sie alle 10 Jahre eine Gruppe bilden wollten. Der folgende Code würde dies erreichen, indem diese Intervalle in einer neuen age grouping-Spalte gespeichert werden:

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